面试题10:斐波那契数列

/**面试题10:斐波那契数列

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

 * 现在要求输入一个整数n,请你输出斐波那契数列的第n

 * 思路:递归的效率低,使用循环

 * @author juaner

 *

 */

public class Fibonacci1 {

 

    public static void main(String[] args) {

       Fibonacci1 f = new Fibonacci1();

       System.out.print(f.fibonacci(2));

 

    }

 

    public long fibonacci (int n) {

       long result = 0;

       long preOne = 1;

       long preTwo = 0;

       if (n == 0) {

           return preTwo;

       }

       if (n == 1) {

           return preOne;

       }

       for (int i = 2;i <= n; i++) {

           result = preOne + preTwo;

           preTwo = preOne;

           preOne = result;

       }

       return result;

    }

}

 

 

/*

 * 题目二:青蛙跳台阶问题

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

 */

public class Fibonacci3 {

    public static void main(String[] args) {

       Fibonacci3 f = new Fibonacci3();

       System.out.print(f.fibonacci(3));

 

    }

 

    public long fibonacci(int target) {

       // 青蛙跳台阶,一次可以跳上1级台阶,也可以跳上2级台阶

       if (target <= 0) {

           return 0;

       }

       if (target == 1) {

           return 1;

       }

       if (target == 2) {

           return 2;

       }

       // 一个n级台阶,第一次跳有两种选择,

       // 一是第一次跳1,那么跳法数目等于后面剩下的n-1级台阶的跳法数目

       // 二是第一次跳2,那么跳法数目等于后面剩下的n-2级台阶的跳法数目

       // 一个n级台阶总的跳法数目为f(n-1) + f(n-2),相当于斐波那契数列

       int first = 1;

       int last = 2;

       int sum = 0;

       for (int i = 3; i <= target; i++) {

           sum = first + last;

           // 将上次的last作为下一次的first

           first = last;

           // 将上次的结果作为last

           last = sum;

       }

       return sum;

    }

}

/

/*

 * 题目:变态跳台阶

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

 */

public class Fibonacci2 {

 

    public static void main(String[] args) {

       Fibonacci2 f = new Fibonacci2();

       System.out.println(f.fibonacci(2));

 

    }

 

    public long fibonacci(int n) {

       return (int) Math.pow(2, n-1);

    }

}

//

/*

 * 题目:矩形覆盖

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

         思路:斐波那契数列思想 同青蛙跳台阶问题解法

 */

public class Fibonacci4 {

    public static void main(String[] args) {

       Fibonacci4 f = new Fibonacci4();

       System.out.print(f.fibonacci(3));

 

    }

 

    public long fibonacci (int n) {

      

       if (n <= 0) {

           return 0;

       }

       if (n == 1) {

           return 1;

       }

       if (n == 2) {

           return 2;

       }

    /*

     *        第一块有两种方式:横着放和竖着放

                                          横这放对应为发f(n-2);

                                          竖着放下一步的放方法为f(n-1);

                                          所以总的放的方法为f(n)=f(n-1)+f(n-2); 相当于斐波那契数列

     */

       int first = 1;

       int last = 2;

       int sum = 0;

       for (int i = 3; i <= n; i++) {

           sum = first + last;

           // 将上次的last作为下一次的first

           first = last;

           // 将上次的结果作为last

           last = sum;

       }

       return sum;

      

      

    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值