剑指Offer09:斐波拉契数列数列问题

斐波拉契数列问题

题目描述:

斐波拉契数列问题:要求实现键盘输入一个数n,输出斐波拉契数列的第n项。斐波拉契数列定义:f(0)=0;f(1)=1;f(n)=f(n-1)+f(n-2);

解题思路:

按照斐波拉契地推公式很容易想到的方法就是采用递归来求解,但是递归方法存在很严重的效率问题;例如要求f(10),需要先求f(9)和f(8),同样要求f(9)必须先求f(8)和f(7),以此类推发现存在较多的重复。
更简单的方法就是从下往上计算,首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)…以此类推就可以算出第n项了。该方法的时间复杂度为o(n)
其实还有一种时间复杂度为o(logn)的方法,但是数学公式较为复杂,一般不够实用。

问题延伸:

青蛙跳台阶问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上n级台阶总共多少种跳法。
分析:
如果只有一级台阶,那么只有一种跳法;如果有2级台阶,那么就有两种跳法:分两次跳,每次跳1级;一次跳2级。那么该问题的结论是:
青蛙跳上n阶台阶的不同跳法是f(n)=f(n-1)+f(n-2)。
青蛙跳台阶升级版:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶…他也可以跳上n级台阶,此时该青蛙跳上n级台阶共有多少种跳法?f(n)=2^n-1。数学归纳法。。。

public class Code009 {
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        System.out.println(fibonacci(n));
        System.out.println(solution(n));
    }
    private static int fibonacci(int n){
        if(n<=0){
            return 0;
        }
        if(n==1){
            return 1;
        }
        return fibonacci(n-1)+fibonacci(n-2);
    }
    private static int solution(int n){
        if(n<=0){
            return 0;
        }
        if(n==1){
            return 1;
        }
        //定义初始n为0和n为1时的值,并用两个变量存储
        int num0=0;
        int num1=1;
        int result=0;
        for(int i=2;i<=n;i++){
            //每一次计算完后立马更新变量的值
            result=num0+num1;
            num0=num1;
            num1=result;
        }
        return result;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值