java 簡單跳臺階和變態跳臺階

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

這裏僅作學習筆記。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章