最多只能跨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分一道。。。。一樣的思想,一樣的諄諄教誨,不一樣的例子。。。
我今天吃飯,明天吃飯,后天吃飯;太陽今天升起,明天升起,后天。。。。大自然因為遞歸而美麗!
看看葉子,你就知道遞歸的美!
算法的世界真的很富饒!