• 【剑指offer】面试题 10. 斐波那契数列


    面试题 10. 斐波那契数列

    题目一:求斐波那契数列的第n项

    题目描述:求斐波拉契数列的第n项
    写出一个函数,输入n,求斐波拉契(Fibonacci)数列的第n项。斐波拉契数列定义如下:
    

    C++ 实现

    /* 斐波拉契数列 */
    #include <iostream>
    using namespace std;
    /* 递归实现 */
    long long Fibonacci1( unsigned int n )
    {
        if ( n <= 1 )
        {
            return(n);
        }
        return(Fibonacci1( n - 1 ) + Fibonacci1( n - 2 ) );
    }
    
    
    /* 非递归实现 */
    long long Fibonacci2( unsigned int n )
    {
        if ( n <= 1 )
        {
            return(n);
        }
        int f1 = 0, f2 = 1, sum;
        for ( int i = 2; i <= n; i++ )
        {
            sum = f1 + f2;
            f1  = f2;
            f2  = sum;
        }
        return(sum);
    }
    
    
    int main()
    {
        /* 测试数据 */
        for ( int i = 0; i <= 20; i++ )
        {
            cout << Fibonacci1( i ) << " ";
        }
        cout << endl;
        for ( int i = 0; i <= 20; i++ )
        {
            cout << Fibonacci2( i ) << " ";
        }
        cout << endl;
        return(0);
    }
    

    运行结果

    0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
    0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765
    请按任意键继续. . .
    

    题目二:青蛙跳台阶问题

    题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
    (F(n)=F(n-1)+F(n-2))
    

    C++ 实现

    #include <iostream>
    using namespace std;
    /* 递归实现 */
    long long JumpStairs( unsigned int n )
    {
        if ( n <= 1 )
        {
            return(n);
        }
        return(JumpStairs( n - 1 ) + JumpStairs( n - 2 ) );
    }
    
    
    int main()
    {
        for ( int i = 1; i <= 20; i++ )
        {
            cout << JumpStairs( i ) << " ";
        }
        cout << endl;
        return(0);
    }
    

    运行结果

    题目三:变态跳台阶

    题目描述:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。
    求该青蛙跳上一个n级的台阶总共有多少种跳法。(F(n)=2*F(n-1))
    

    C++ 实现

    #include <iostream>
    using namespace std;
    /* 递归实现 */
    long long JumpStairs( unsigned int n )
    {
        if ( n <= 1 )
        {
            return(1);
        }
        return(2 * JumpStairs( n - 1 ) );
    }
    
    
    int main()
    {
        for ( int i = 1; i <= 10; i++ )
        {
            cout << JumpStairs( i ) << " ";
        }
        cout << endl;
        return(0);
    }
    

    运行结果

    题目四:矩形覆盖

    题目描述:我们可以用2×1的小矩形横着或者竖着去覆盖更大的矩形。
    请问用n个2×1的小矩形无重叠地覆盖一个2×n的大矩形,总共有多少种方法?
    

    Java 实现

    public class Solution {
        public int RectCover(int target) {
            if (target <= 2)
                return target;
            return RectCover(target - 1) + RectCover(target - 2);
        }
    }
    

    运行结果

    0 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 
    
  • 相关阅读:
    数据库迁移至ASM
    获取数据库或SHEME的DDL语句
    membership配置数据库(SQL2000)
    DIV+CSS到底是什么?
    如何更改表的所有者权限
    windows server 2003 上“您要访问的网页有问题,无法显示。HTTP 500 内部服务器错误。”的问题解决方案!
    瞎忙
    瞎忙
    如何更改表的所有者权限
    DIV+CSS到底是什么?
  • 原文地址:https://www.cnblogs.com/hgnulb/p/8975031.html
Copyright © 2020-2023  润新知