(2)斐波那契数列及其应用跳台阶问题

来源:互联网 发布:时时彩后二缩水软件 编辑:程序博客网 时间:2024/06/09 21:50

斐波那契公式:


递归实现:

输入参数n类型:unsigned int

函数体:

if : n  == 0 -->返回 0

if : n  == 1 -->返回1

if : n >= 2 --> 返回function(n - 1) + function(n - 2)

分析:随着n 的增大,重复计算同一个数的次数明显增多,例如求f(9)会用到f(6);求f(8) 和f(7) 同样会用到f(6);

           故随着n的增大 ,递归所用资源急剧上升;

           时间复杂度随着n 的增大呈现指数级增长;


循环实现:

当 (n >= 2)时,Fibonacci(2) = Fibonacci(0) + Fibonacci(1);

                         Fibonacci(3) = Fibonacci(1) + Fibonacci(2);

                         .....................................................................

                         Fibonacci(n) = Fibonacci(n-1) + Fibonacci(n-2);

故求f(n)时,只需要知道f(n-1),f(n-2)即可;

时间复杂度O(n);


代码实现:

#include<iostream>using namespace std;//----------------------------------------递归实现----------------------------------------------long long   Fibonacci1(unsigned int n){if(n < 2)return n;elsereturn  Fibonacci1(n - 1) + Fibonacci1(n - 2);}//--------------------------------------循环实现---------------------------------------------------long long  Fibonacci2(unsigned int n){if(n < 2) return n;long long  FeiOne = 0;long long  FeiTwo = 1;long long  FeiN = 0;for(unsigned  i = 2; i <= n; ++i){FeiN = FeiOne + FeiTwo;FeiOne = FeiTwo;FeiTwo = FeiN;}return FeiN;}
int main(){unsigned int n;cout<<"请输入一个正整数:";cin>>n;cout<<n<<'\n';cout<<"斐波那契数列Fei1()为:"<<Fibonacci1(n)<<'\n';cout<<"斐波那契数列Fei2()为:"<<Fibonacci2(n)<<endl;return 0;}


跳台阶问题:

问题描述:一只青蛙一次可以跳上一级台阶,也可以跳上2级台阶;求该青蛙跳上一个n阶的台阶,总共有多少跳法?


分析:n =1-->直接跳上,跳法为1;

           n = 2-->先跳台阶1,再跳台阶2;或者直接跳上台阶2;跳法总共有2种;

           n > 2时;(1)若青蛙从台阶n-1,直接跳到台阶n;则跳法总数F(n) = F(n - 1)

                             (2)若青蛙从台阶n-2,直接跳到台阶n;则跳法总数F(n) = F(n - 2)

                             故:F(n) = F(n - 1) + F( n - 2);

发现其实是斐波那契数列的应用;