關於爬樓梯問題的斐波那契數列


最多只能跨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分一道。。。。一樣的思想,一樣的諄諄教誨,不一樣的例子。。。

我今天吃飯,明天吃飯,后天吃飯;太陽今天升起,明天升起,后天。。。。大自然因為遞歸而美麗!

看看葉子,你就知道遞歸的美!

算法的世界真的很富饒!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM