1. 程式人生 > >java 簡單跳臺階和變態跳臺階

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

這裡僅作學習筆記。