第10题 小杨正在爬楼梯,需要爬 n n阶才能到达楼顶。如果每次可以爬1个或2个台阶,下面代码采用递推算法来计算一共有多少种不同的方法可以爬到楼顶,则横线上应填写( )。
【答案】B
【考纲知识点】 递推算法
【解析】
问题分析
这是一个经典的爬楼梯问题,其核心思想是:到达第n阶楼梯的方法数等于到达第n - 1 阶楼梯的方法数加上到达第n - 2 阶楼梯的方法数。因为每次只能爬1个或2个台阶,所以要到达第n阶,要么是从第n - 1 阶爬1个台阶上来,要么是从第n - 2 阶爬2个台阶上来。
各选项分析
选项A:
res += f1 + f2;
f1 = f2;
f2 = res;
res += f1 + f2; 这种累加方式不符合状态转移方程,会导致结果错误。正确的做法是直接将f1和f2的和赋值给res,而不是累加。所以选项A错误。
选项B:
res = f1 + f2;
f1 = f2;
f2 = res;
首先res = f1 + f2; 计算出到达第i阶楼梯的方法数,然后f1 = f2; 将f2的值赋给f1,更新f1为到达第i - 1 阶楼梯的方法数,最后f2 = res; 将res的值赋给f2,更新f2为到达第i阶楼梯的方法数,为下一次循环做准备。这种方式符合递推算法的状态转移方程,是正确的。所以选项B正确。
选项C:
res += f1 + f2;
f2 = res;
f1 = f2;
同样,res += f1 + f2; 不符合状态转移方程,而且f2 = res; 和f1 = f2; 的顺序会导致f1和f2的值更新错误。所以选项C错误。
选项D:
res = f1 + f2;
f2 = res;
f1 = f2;
虽然res = f1 + f2; 计算出了到达第i阶楼梯的方法数,但f2 = res; 和f1 = f2; 的顺序会导致f1和f2的值更新错误,没有正确维护递推关系。所以选项D错误。
综上,答案选B。