A1 用递归解决爬楼梯问题
public static int cs(int n){
if(n <= 3){
return n;
}
return cs(n-1) + cs(n-2);
}
A2 两个变量实现斐波那契数列
public static int cs(int n){
int prev = 0;
int curr = 0;
for(int i = 1 ; i<= n; i++){
int tmp = curr;
curr = curr+prev;
prev = tmp;
}
return curr;
}
A3 两个变量解决爬楼梯的问题
public static int cs(int n){
int prev = 0;
int curr = 1;
for(int i = 1 ; i<= n; i++){
int tmp = curr;
curr = curr+prev;
prev = tmp;
}
return curr;
}
A4 尾递归 实现斐波那契数列
System.out.print(cs(3, 0, 1));
public static int cs(int n, int ret1, int ret2){
// 递到底了
if(n == 0){
return ret1;
}
return cs(n-1, ret2, ret1+ret2);
}
A5 尾递归解决爬楼梯
这里函数代码和上面并无不同,不同的是调用的时候初始传参的问题,也是这篇文章所思考的问题
System.out.print(cs(3, 1, 1));
public static int cs(int n, int ret1, int ret2){
// 递到底了
if(n == 0){
return ret1;
}
return cs(n-1, ret2, ret1+ret2);
}
一个典型的斐波那契数列是这样的:
1 1 2 3 5 8
为什么 前两个数字都是1呢?
在A2中为什么curr的初始值是1呢,为什么不是prev是1呢?为什么curr不是2呢?只是因为我们测试后发现这个值是1才能得出正确的结果吗?显然不是这样子的
那么,我们可不可以这么看斐波那契数列
0 1 1 2 3 5 8 (0+1,1+1,1+2)
那爬楼题问题里,我们首先要总结下规律:
它是这样的:
1 2 3 5 8
和上面的相比它少了一个1,想套用斐波那契数列的公式的话,我们也给它补全一下
0 1 1 2 3 5 8
少了一个1的初始值,所以,我们给它补上1,相同的道理,如果碰到其他问题,我们可以差多少给它补多少
如有不对,欢迎指正
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。