跳台阶问题

来源:互联网 发布:unity3d 路径动画 编辑:程序博客网 时间:2024/06/05 05:28

【题 目】一个台阶一共有n阶,一次起跳可以跳一阶,也可以跳二阶。问总共有多少中跳法,并对时间复杂度进行分析。

【思 路】如果只有一阶,那么只有一种跳法;如果有2阶,那么有2中跳法(跳1阶再跳1阶,一次跳2阶);那么如果有n阶呢?假设对于n阶的阶梯,我们有f(n)种跳法;那么n阶时,我们考虑如果第一次跳共有两种选择:第一次跳了1阶,剩下n-1阶有f(n-1)种跳法;第一次跳了2阶,剩下的n-2阶有f(n-2)种跳法,那么总共的跳法数就是f(n-1)+f(n-2)。到这里我们可以看出这就是斐波那契数列的递归公式,只是前两项稍有区别,写成数学表达式如下:

【代 码】

代码1(递归,指数级):

#include<iostream>
#include<string>
using namespace std;


int Fibonacci( int n)
{
    if(n == 0)
        return 0;
    else if(n == 1)
        return 1;
    else
        return Fibonacci(n-1) + Fibonacci(n-2);
}


int main()
{
    cout<<"Enter An N:"<<endl;
    int number=0;
    cin>>number;
    cout<<Fibonacci(number)<<endl;
    return 0;
}


代码2(非递归,O(n)):

#include<iostream>
#include<string>
using namespace std;


int Fibonacci(int n)
{
    if(n == 0)
        return 0;
    if(n == 1)
        return 1;
    int firstItem = 0;
    int secondItem = 1;
    int fib = 0;
    int cnt = 1;
    while(cnt < n)
    {
        fib = firstItem + secondItem;
        firstItem = secondItem;
        secondItem = fib;
        ++cnt;
    }
    return fib;
}


int main()
{
    cout<<"Enter A Number:"<<endl;
    int number;
    cin>>number;
    cout<<Fibonacci(number)<<endl;
    return 0;
}

0 0
原创粉丝点击