斐波那契数列、跳台阶及变态跳台阶详解

JZ7 斐波那契数列

题目:大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。
n<=39
思路: 看到这道题,我们很自然的会想到用递归的方法,但递归方法有很严重的效率问题,假如我们输入10,分析下其递归的求解过程,要想求得f(10),需要先求f(9) 和f(8),同样,想求得f(9),需要求得f(8)和f(7),想求得f(8),需要求得f(7)和f(6)…从这种相互依赖关系,我们可发现有很多数是被重复使用的,重复的数会随着n的增大而急剧增加,事实上,用递归方法计算的时间复杂度是以n的指数方式递增的。简单的方法就是从下往上计算,首先根据f(0)和f(1)算出f(2),再根据f(1)和f(2)算出f(3)…以此类推就可以算出第n项了。这种思路的时间复杂度是O(n)。
【代码】

package com.cc.jianzhi;
/*
斐波那契数列:F(0)=0,F(1)=1,F(n)=F(n-1)+F(n-2)
 */
import java.util.Scanner;
public class FibonacciSeq {
    public static void main(String[] args) {
        System.out.println("请输入一个整数:");
        Scanner input=new Scanner(System.in);
        int number=input.nextInt();
        System.out.println(FibonacciSequence(number));
    }
public static int FibonacciSequence(int n){
    int f0=0,f1=1;
    //第0项
    if (n==0){
        return 0;
    }
    //第1项
    if (n==1){
        return 1;
    }
    int fn=0;
    //迭代计算第n项
    for (int i=2;i<=n;i++){
        fn=f0+f1;
        f0=f1;
        f1=fn;
    }
    return fn;
}
}
#请输入一个整数:
#11
#89

JZ8 跳台阶

题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路: 倾向于找规律的解法,f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, 可以总结出f(n) = f(n-1) + f(n-2)的规律。假设现在6个台阶,我们可以从第5跳一步到6,这样的话有多少种方案跳到5就有多少种方案跳到6,另外我们也可以从4跳两步跳到6,跳到4有多少种方案的话,就有多少种方案跳到6,其他的不能从3跳到6什么的啦,所以最后就是f(6) = f(5) + f(4)。这样子也很好理解下一题变态跳台阶的问题了。
【代码】

package com.cc.jianzhi;
/*
跳台阶:一次可以跳一级也可以跳2级,跳上一个n级台阶,有几种跳法
 */
import java.util.Scanner;
public class JumpFloor {
    public static void main(String[] args) {
        Scanner input= new Scanner(System.in);
        int t=input.nextInt();
        JumpFloor jf=new JumpFloor();
        System.out.println(jf.JumpFloor(t));
    }
public int JumpFloor(int target){
    //只有一个台阶
    if (target == 1){
        return 1;
    }
    //只有两个台阶
    if(target ==2){
        return 2;
    }
    //大于2个台阶的分两种情况,并相加
    return JumpFloor(target-1)+JumpFloor(target-2);
}
# 11
# 144

JZ9 变态跳台阶

题目:一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路: 关于本题,前提是n个台阶会有一次n阶的跳法。分析:f(1)=1, f(2)=f(2-1)+f(2-2),f(2-2)表示2阶一次跳2阶的次数,f(3)=f(3-1)+f(3-2)+f(3-3)…f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(n-(n-1))+f(n-n)。n=1时,只有1种跳法,f(1)=1;n=2时,会有两个跳的方式,一次1阶或者2阶,f(2)=f(2-1)+f(2-2);n=3时,会有3种跳的方式,1阶、2阶、3阶,那就是第一次跳出1阶后面剩下:f(3-1);第一次跳出2阶,剩下f(3-2);第一次3阶,那么剩下f(3-3),因此结论是f(3)=f(3-1)+f(3-2)+f(3-3);当n=n时,会有n种跳的方式,1阶、2阶、3阶…n阶,得f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(n-(n-1))+f(n-n)=f(0)+f(1)+f(2)+…f(n-1),f(n-1)=f(0)+f(1)+f(2)+f(3)+…f(n-2),因此进一步简化得f(n)=f(n-1)+f(n-1)=2*f(n-1)。

【代码】

package com.cc.jianzhi;
import java.util.Scanner;
public class JumpFloorII {
        public static void main(String[] args) {
            Scanner input= new Scanner(System.in);
            int t=input.nextInt();
            JumpFloorII jf=new JumpFloorII();
            System.out.println(jf.JumpFloorII(t));
        }
        public int JumpFloorII(int target){
            if (target == 1)
                return 1;
            return 2 * JumpFloorII(target-1);
        }
    }
# 6
# 32
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值