java 简单跳台阶和变态跳台阶

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lilong117194/article/details/83926776

1. 简单跳台阶

1.1 题目描述

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

1.2 解题思路

对于本题,有题目描述可知,每次只能跳一个或者两个台阶,下面找一下规律:
这里假设有n阶台阶时就有f(n)种跳法

  1. 当有1阶台阶时只有一种跳法:f(1) = 1
  2. 当有2阶台阶时就可以有两种跳法:f(2) = 2
  3. 当有3阶台阶时,这时我们先看第一步怎么走,分两种情况:
    当先跳1个台阶,那剩下就是2个台阶,这时剩下的2个台阶最多只有f(2)种跳法; 当先跳2个台阶,那剩下就是1个台阶,就是f(1)种跳法;那么也即是n=3时,两种情况加起来就是:f(3)=f(1)+f(2)
  4. 当有4阶台阶时,同理我们这里也分两种情况:
    当先跳1个台阶,那剩下就是3个台阶,这时剩下的3个台阶最多只有f(3)种跳法; 当先跳2个台阶,那剩下就是2个台阶,就是f(2)种跳法;那么也即是n=4时,两种情况加起来就是:f(4)=f(3)+f(2)

从行面的分析可以看出,这其实是一个斐波那契数列。

1.3 代码

方法1:

public class JumpingStairs {

	public static void main(String[] args){
		JumpingStairs mm=new JumpingStairs();
		int tt=mm.jump(3);
		System.out.println(tt);		        
   }
	
	public int jump(int n){
		if (n==0)
			return 0;
		int f1=1;
	    int f2=2;
	    
        while(n>1) {  
        	
            f2 += f1;
            f1=f2-f1; 
            n--;
        }
        return f1;  
	}
	
}

运行:

3

方法2:

public class JumpingStairs {

	public static void main(String[] args){
		JumpingStairs mm=new JumpingStairs();
		int tt=mm.jump(3);
		System.out.println(tt);		        
   }
	
	public int jump(int target){
		if(target <= 0) return 0;
        if(target == 1) return 1;
        if(target == 2) return 2;
        int one = 1;
        int two = 2;
        int result = 0;
        for(int i = 2; i < target; i++){
            result = one+ two;
            one = two;
            two = result;
        }
        return result;
	}
}

2. 变态跳台阶

2.1 题目描述

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

2.2 解题思路

这里的f(n) 代表的是n个台阶的跳法数。

  • n = 1时,只有1种跳法,f(1) = 1
  • n = 2时,这里同样按照上面简单跳台阶的分析方式:
    当第一步跳1阶时,那么剩下的1阶只用1种跳法,即f(1);当第一步跳2阶时,那就不剩下阶梯了,也即是f(0)种跳法,这里f(0)=1,代表一步跳到最高层。得到:f(2)=f(1)+f(0)
  • n = 3时,分析同上:
    当第一步跳1阶时,那么剩下的2阶只用f(2)种跳法,即f(2);当第一步跳2阶时,那剩下1个阶梯,只有f(1)种跳法,当第一步跳3阶时,那剩下0个阶梯,这种一步跳法即是f(0)。得到f(3)=f(2)+f(1)+f(0)
  • n = n-1时,会得到:
    f(n-1) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)
  • n = n时,会得到:
    f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)+ f(n-1)

综上:
f(n) = f(0) + f(1) + f(2) + f(3) + … + f(n-2)+ f(n-1)=f(n-1)+f(n-1)= 2*f(n-1)

2.3 代码

public class MetaJumpingStairs {

	public static void main(String[] args){
		MetaJumpingStairs mm=new MetaJumpingStairs();
		int tt=mm.jump(3);
		System.out.println(tt);		        
   }
	
	public int jump(int target){
		int f=1;
		if (target<=0)
			return 0;
        while(target>1){
            f=2*f;
            target--;
        }
        return f;
	}	
}

运行:

4

这里仅作学习笔记。

猜你喜欢

转载自blog.csdn.net/lilong117194/article/details/83926776
今日推荐