zoukankan      html  css  js  c++  java
  • 关于爬楼梯问题的斐波那契数列

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

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

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

    算法的世界真的很富饶!

  • 相关阅读:
    StringBuffer和StringBuilder
    深入理解String类(重点)
    Java8新特性之:接口的默认方法和静态方法
    浅谈java接口
    浅谈java抽象
    java三大特性——多态
    #小练习 SGMLParser练习 分类: HTMLParser 2013-11-12 15:50 456人阅读 评论(0) 收藏
    SGMLParser 分类: HTMLParser 2013-11-12 15:25 1066人阅读 评论(1) 收藏
    #小练习 解析HTML文件并使用字典保存链接 分类: HTMLParser python 小练习 2013-11-11 12:06 267人阅读 评论(0) 收藏
    #小练习 使用HTMLParser获取data时注意事项 分类: python 小练习 HTMLParser 2013-11-08 21:05 335人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/beihaidao/p/5682089.html
Copyright © 2011-2022 走看看