N級臺階(比如100級),每次可走1步或者2步,求總共有多少種走法?
阿新 • • 發佈:2019-01-23
走臺階演算法(本質上是斐波那契數列)在面試中常會遇到,描述就如題目那樣:總共100級臺階(任意級都行),小明每次可選擇走1步、2步或者3步,問走完這100級臺階總共有多少種走法?
一、 題目分析
這個問題本質上是斐波那契數列,假設只有一個臺階,那麼只有一種跳法,那就是一次跳一級,f(1)=1;如果有兩個臺階,那麼有兩種跳法,第一種跳法是一次跳一級,第二種跳法是一次跳兩級,f(2)=2。如果有大於2級的n級臺階,那麼假如第一次跳一級臺階,剩下還有n-1級臺階,有f(n-1)種跳法,假如第一次條2級臺階,剩下n-2級臺階,有f(n-2)種跳法。這就表示f(n)=f(n-1)+f(n-2)。將上面的斐波那契數列程式碼稍微改一下就是本題的答案。我們來看一下程式碼的實現。
二、斐波那契數列法
public class Test {
static final int s = 100; //自定義的臺階數
static int compute(int stair){
if ( stair <= 0){
return 0;
}
if (stair == 1){
return 1;
}
if (stair == 2){
return 2;
}
return compute(stair-1 ) + compute(stair-2);
}
public static void main(String args[]) {
System.out.println("共有" + compute(s) + "種走法");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
三、 走臺階問題的簡單解決演算法
但我自己對於這個題目最早的想法是使用樹(多叉樹)的方式,100為根節點,每次選擇的分支有兩種(1、2),然後生成深度為1的樹,再從每個2級節點延伸出1、2兩個分支,直到所有節點的值<=0,最後統計出所有值為0的葉子節點的數目,就是結果。
不過自己想法實際上把問題複雜化了,下面這種使用遞迴方式實現的演算法本質上和我的思想差不多,但是很明顯下面這個演算法會簡單很多。接下來我們來看看這個演算法的實現方式。
public class Test {
static final int s = 100; //自定義的臺階數
static int len = 0, sum = 0;
//最多也只有走100步就到了
static int step[] = new int[s];
static void compute(final int stair) {
if (stair < 0)
return;
//表示已經走完了
if (stair == 0) {
printSum();
sum++;
return;
}
//每次到下一步選擇時都可以走1-2步
for (int i = 1; i <= 2; i++) {
step[len] = i;
len++;
//進行下一步的迭代,迭代完之後將每後加上的一步去掉,換成其它的步數(如從1換成2)
compute(stair - i);
len--;
}
}
static void printSum() {
System.out.print("走法:");
for (int i = 0; i < len; i++)
System.out.print(step[i] + " ");
System.out.println();
}
public static void main(String args[]) {
compute(s);
System.out.println("共有" + sum + "種走法");
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42