算法(二)---斐波那契数列

输出斐波那契数列列第n列

(一)题目描述

求斐波那契数列的第n项,n<=39

(二)解题思路

(1)发现问题
如果使用”递归“就会出现一个问题,递归会重复计算一些子问题,计算f(10)需要计算f(9)和f(8),计算f(9)要计算f(8)和f(7),但是f(8)已经计算过了,重复计算会导致算法的效率降低

(2)解决方法
递归是把一个问题划分成多个子问题求解,动态规划也是划分成富哦个子问题。
但是动态规划会把子问题的解缓存起来,从而避免重复求解子问题

代码示例

public class Solution {
    private int[] fibonacci=new int[40];

    public Solution(){
        fibonacci[1]=1;
        fibonacci[2]=2;
        for (int i = 2; i <= fibonacci.length; i++) {
            fibonacci[i]=fibonacci[i-1]+fibonacci[i-2];
        }
    }

    public int Fibonacci(int n){
        return fibonacci[n];
    }
}

青蛙跳台阶

题目描述

一只青蛙一次可以跳上1个台阶,也可以跳上2个台阶。
求青蛙跳上一个n级台阶总共有多少种跳法(先后次序不同算不同的结果)

解题思路

如果只有一个台阶,显然只有一种跳法
如果有两个台阶,那就有两种跳法:一种是一级一级跳,一种是一下跳两级

再讨论一下一般情况:
n级台阶时的跳法看成是n的函数f(n)。当n>2时,第一次跳的时候就有两种不同的选择
第一次跳一级,剩下n-1级,跳法是f(n-1)种
第一次跳两级,剩下n-2级,跳法是f(n-2)种
所以,n级台阶的不同跳法的总数为f(n)=f(n-1)+f(n-2),就能看出这是个斐波那契数列

代码示例

public class JumpFloor {

    public static void main(String[] args) {
        int n=4;
        System.out.println("跳法的种数为:"+JumpFloor(n));
    }

    public static int JumpFloor(int n){
        if (n<=0)
            return 0;

        if (n<=2)
            //n级台阶
            return n;

        //n为1时有1种跳法
        int pre2=1;
        //n为2时有2种跳法
        int pre1=2;
        //一共多少种跳法
        int result=1;
        //当n>=2时,共有f(n)=f(n-1)+f(n-2)种
        //下一步是f(n-1)=f(n-2)+f(n-3)
        /**
         * 这是循环实现
         */
        /*for (int i = 2; i < n; i++) {
            result=pre1+pre2;
            //这样把值递进交换,就不会重复计算值了
            pre2=pre1;
            pre1=result;
        }
        return result;*/

        /**
         * 这是递归实现
         */
        return JumpFloor(n-1)+JumpFloor(n-2);
    }

}

变态跳台阶

题目描述

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

解题思路

跳上n-1级台阶,可以从n-2级跳1级上去,也可以从n-3级跳2级上去
那么f(n-1)=f(n-2)+f(n-3)+…+f(0)
同样,跳上n级台阶,可以从n-1级跳上1级上去,也可以从n-2级跳2级上去,那么f(n)=f(n-1)+f(n-2)+…+f(0)
综上可得
f(n)-f(n-1)=f(n-1),即f(n)=2*f(n-1)
所以f(n)是一个等比数列

public class JumpFloorll {
    public int JumpFloorll(int target){
        return (int) Math.pow(2,target-1);
    }
}
发布了41 篇原创文章 · 获赞 5 · 访问量 655

猜你喜欢

转载自blog.csdn.net/weixin_44823875/article/details/104931366