Java 剑指offer 面试题10:斐波那契数列

求斐波那契数列的第n项

递归:

递归法实现起来简单,但是因为会计算重复的节点,这就意味着计算量会随着n的增大急剧增大。当计算n=50,第50项的时候已经相当耗时

非递归:

可以采用循环,先得到f(0)  f(1)  相加得到f(2)  再相加得到f(3)   再得到f(4)    依次得到f(n)  

//写一个函数,输入n,求斐波那契数列的第n项
public class Fibonaccisequence {
    /**
     *递归处理
     */
    public static long  printFibonaccisequence(int n){
        if(n==0){
            return 0;
        }else if(n==1){
            return 1;
        }else{
            return printFibonaccisequence(n-1)+printFibonaccisequence(n-2);
        }
    }

    //非递归处理
    public static long  getFibonaccisequence(int n){
        if(n==0){
            return 0;
        }
        if(n==1){
            return 1;
        }
        long firstMinus = 0;
        long secondMinus = 1;
        long N = 0;
        for(int i=2;i<=n;i++){
            N = firstMinus + secondMinus;
            firstMinus = secondMinus;
            secondMinus = N;
        }
        return  N;
    }


    public static void main(String[] args) {
        long i = Fibonaccisequence.getFibonaccisequence(2);
        long i2 = Fibonaccisequence.printFibonaccisequence(5);
        System.out.println(i);
        if(i==i2){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
    }
}

变形:青蛙跳台阶

同样也是斐波那契数列的应用   注意前3项与斐波那契数列的不同   但也是菲波那切数列的应用

/**
 * 一只青蛙 一次可以跳上一个台阶,也可以跳上两个台阶,求该青蛙跳上n阶台阶一共有多少种跳法
 */
public class FrogUpStairs {
    //递归
    public static long frogUpStairsByRecursive(long n){
        if(n==0){
            return 0;
        }else if(n==1){
            return 1;
        }else if(n==2){
            return 2;
        }else{
            return frogUpStairsByRecursive(n-1)+frogUpStairsByRecursive(n-2);
        }

    }


    //非递归
    public static long FrogUpStairs(int n){
        if(n==0){
            return 0;
        }
        if(n==1){
            return 1;
        }
        if(n==2){
            return 2;
        }
        long firstMaxium = 1;
        long secondMaxium = 2;
        long N = 0;
        for (int i=3;i<=n;i++){
            N = firstMaxium + secondMaxium ;
            firstMaxium = secondMaxium;
            secondMaxium =N;
        }
        return N;
    }

    public static void main(String[] args) {
        //long i = FrogUpStairs.frogUpStairsByRecursive(30);
        long i1 = FrogUpStairs.FrogUpStairs(100);
        System.out.println(i1);
        //System.out.println(i);
    }
}

 

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值