最多只能跨3个台阶:
要上15个台阶,一个又多少种方法?理解如下:
到n台阶 走法(一步到位,2步到位,3步到位...) 选择
1 1 1
2 2;11 2
3 3;12,21;111 4
4 13,31,22,;112,211,121;1111 7
5 23,32;113,311,131,122,212,221;1112,1121,1211,2111;11111 13
....
所以f(n)=f(n-1)+f(n-2)+f(n-3)
1 // 非递归 2 #include <iostream> 3 using namespace std; 4 int main() 5 { 6 int f1=1,f2=2,f3=4,fn; 7 int n; 8 cout<<"输入n="; 9 cin>>n; 10 if(n <= 0) return -1; 11 else if(n==1) {cout<<f1; return 0;} //很有必要复习下if else语句啊 12 else if(n==2) cout<<f2; 13 else if(n==3) cout<<f3; 14 else 15 { 16 for(int i=4; i<=n;i++) 17 { 18 fn =f3+f2+f1; 19 f1=f2; 20 f2=f3; 21 f3=fn; 22 } 23 cout<<fn; 24 } 25 return 0; 26 }
方法2:
1 // Note:Your choice is C++ IDE 2 #include <iostream> 3 using namespace std; 4 5 long f1 = 1; 6 long f2 = 2; 7 long f3 = 4; 8 long fn = 0; 9 long fibonacci(int n) 10 { 11 if(n<=0) return -1; 12 if(n==1) return 1; 13 if(n==2) return 2; 14 if(n==3) return 4; 15 16 for(int i = 4; i <= n; i++) 17 { 18 fn =f3+f2+f1; 19 f1=f2; 20 f2=f3; 21 f3=fn; 22 } 23 return fn; 24 } 25 int main() 26 { 27 int n; 28 cout<<"输入n="; 29 cin>>n; 30 cout <<"f("<<n<<")="<<fibonacci(n)<<endl; 31 return 0; 32 }
突然想起大一时老师说的兔子问题,f(n)=f(n-1)+f(n-2);老师好像也讲了一个爬楼梯,她说那个是最多可以跨2个台阶,所以计算和兔子是一样的表达式,只有两项相加,这个是最多3个台阶,所以3项相加;
又想起老师说的那个什么梵塔问题,
64个盘子,如果你放了63个,我放最后(最底的)一个就一步;
63 有人放了62个,我放最后(最底的那个)一个也就是1步;
1 // Note:Your choice is C++ IDE 2 #include <iostream> 3 using namespace std; 4 5 6 void hanoi(int n, char a, char b, char c) 7 { 8 if(n==1) //一个盘子,直接从a到c 9 cout<<a<<" to "<<c<<endl; 10 else 11 { 12 hanoi(n-1,a,c,b);//将n-1个盘子从a柱子(借助c)移动到b 13 cout<<a<<" to "<<c<<endl;//最底的盘子从a到c 14 hanoi(n-1,b,a,c);//n-1个盘子到了最终的位置 15 } 16 } 17 int main() 18 { 19 char a='a',b='b',c='c'; 20 int n; 21 cout<<"输入n="; 22 cin>>n; 23 hanoi(n,a,b,c); 24 return 0; 25 }
到这里,又想起人工智能课上的用宽度优先和广度优先解决寻路问题,现在印象中只有9宫格轮序变为给定模式那个。。有上下左右四种走法,每走一步考虑的是当前与目标的差异,那些点已经在正确的位置了,每一步都向正确位置靠拢。。。有点像贪婪算法。。
综上,递归,确实是最美的思想,最美的发明,我每天都在递归,鄢老师的算法课有很多好玩的断言,比如:
要是我铺路,我就先不铺,先让大家踩,久了就有一条路了,我再照着这条路铺,这样就解决了草坪踩踏问题啦,但是这样铺出来的路,是否美观的?哈哈哈哈
分片很美,这个问题很难解决,但是我会解一点点;物理的最后2道大题,18分一道啊,不全会也可以做第一二步,按步骤给分,至少也有个10分一道。。。。一样的思想,一样的谆谆教诲,不一样的例子。。。
我今天吃饭,明天吃饭,后天吃饭;太阳今天升起,明天升起,后天。。。。大自然因为递归而美丽!
看看叶子,你就知道递归的美!
算法的世界真的很富饶!