关于爬楼梯问题的斐波那契数列

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

我今天吃饭,明天吃饭,后天吃饭;太阳今天升起,明天升起,后天。。。。大自然因为递归而美丽!

看看叶子,你就知道递归的美!

算法的世界真的很富饶!