分析
1、n=0 和 n=1 的时候 并没有其他可选择的,所以可以得出f(0)=0;f(1)=1;
2、n>=2时情况就变复杂起来,但是这个时候可以操作的步骤也就2种
也就是走1步(n-1)与走2步(n-2)。所以可以得到f(n)=f(n-1)+f(n-2);
从当前状态转为下一状态的通用算法既可。
3、 验证,使用2以上的数字验证几次。
实现
实现算法往往是简单的,及时是复杂算法也花费不了太多精力,所以将问题转换为数学问题是一种很好的选择。当前这种简单算法实现方式更为简单,而且往往不止一种方式。
一、递归方法:
/**
* 算法:有n步台阶,一次只能上1步或2步,共有多少种走法
* f(0) = 0 (种走法)
* f(1) = 1 种走法)
* f(2) = 2 (种走法,1+1步或2步)
* 如果n > 2的话, f(3) = 3, f(4) = 5, f(5) = 8,也即:f(5)=f(4)+f(3);
* 得到公式如下:f(n) = f(n-1) + f(n-2);
* @return
*/
public int getWalkNum(int n) {
if (n <= 2) {
return n;
}
return getWalkNum(n - 1)+ getWalkNum(n - 2);
}
优点:可能是最好理解的算法了把。代码简单,好理解。
缺点:计算次数颇多,有很多冗余计算。
二、迭代方法:
public int getWalkNum2(int n) {
if (n <= 2) {
return n;
}
int first = 1, second = 2;
int third = 0;
for (int i = 3; i <= n; i++) {
third = first + second;
first = second;//计算完third值之后将second值再赋值给first
second = third;//计算完third值之后将third值再赋值给second,方便下一轮计算
}
return third;
}
优点: 基本没有冗余计算,效率高
缺点: 谁能一次读完就理解的?
网友评论