斐波那契数———青蛙跳台阶

(1)一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法。
(2)一只青蛙一次可以跳上1级台阶,也可以跳上2 级……它也可以跳上n 级,此时该青蛙跳上一个n级的台阶总共有多少种跳法?

分析:1)当n = 1, 只有1中跳法;当n = 2时,有两种跳法;当n = 3 时,有3种跳法;当n = 4时,有5种跳法;当n = 5时,有8种跳法;…….

    规律类似于Fibonacci数列

代码如下:

#include
using namespace std;
////////////////////////////////////////////////////////////////////////////////////////////
//斐波那契数就是后一项是前一项加前两项:0,1,1,2,3,5,8,。。。f0=0,f1=1,fn=f(n-1)+f(n-2);
//斐波那契数列的变种就是青蛙跳台阶的问题
////////////////////////////////////////////////////////////////////////////////////////////

//方法一:使用递归
long long Fibonacci1(unsigned int n)
{
    if (n == 0)
    {
        return 0;
    }
    if (n == 1)
    {
        return 1;
    }
    return Fibonacci1(n - 1) + Fibonacci1(n - 2);
}

//方法二:采用非递归的方法
long long Fibonacci2(unsigned int n)
{
    int res[2] = { 0, 1 };
    if (n<2)
    {
        return res[n];
    }
    long long Fib = 0;
    long long PreFibOne = 1;
    long long PreFinTwo = 0;
    for (int i = 2; i <= n; i++)
    {
        Fib = PreFibOne + PreFinTwo;

        PreFinTwo = PreFibOne;
        PreFibOne = Fib;
    }

    return Fib;
}


int main()
{
    unsigned int n;
    cin >> n;
    long long res1 = Fibonacci1(n);
    cout << res1 << endl;
    long long res2 = Fibonacci2(n);
    cout << res2;
    system("pause");
    return 0;
}

你可能感兴趣的:(牛客网题)