java 簡單跳臺階和變態跳臺階
阿新 • • 發佈:2018-11-10
1. 簡單跳臺階
1.1 題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
1.2 解題思路
對於本題,有題目描述可知,每次只能跳一個或者兩個臺階,下面找一下規律:
這裡假設有n階臺階時就有f(n)種跳法
- 當有1階臺階時只有一種跳法:f(1) = 1
- 當有2階臺階時就可以有兩種跳法:f(2) = 2
- 當有3階臺階時,這時我們先看第一步怎麼走,分兩種情況:
當先跳1個臺階,那剩下就是2個臺階,這時剩下的2個臺階最多隻有f(2)種跳法; 當先跳2個臺階,那剩下就是1個臺階,就是f(1)種跳法;那麼也即是n=3時,兩種情況加起來就是:f(3)=f(1)+f(2) - 當有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
這裡僅作學習筆記。