編程題:
有n步臺階,一次只能上1步或2步,共有多少種走法?
- 遞歸
優點:大問題轉小問題,可以減少代碼量,同時代碼精簡,可讀性好
缺點:遞歸調用浪費了空間,而且遞歸太深容易造成堆棧的溢出
- 循環迭代
優點:代碼運行效率好,沒有額外空間的開銷
缺點:代碼不如遞歸簡潔,可讀性較差
附上代碼
package com.java_foundation.test_3;
import org.junit.Test;
/**
* @program: java_foundation
* @description: 有n步臺階,一次只能上1步或2步,共有多少種走法?
* @author: xiongbangwen <Email>[email protected]</Email>
* @create: 2020-05-31 01:13
**/
public class StepAlgorithm {
//遞歸實現,簡潔,但是當數據量大的時候效率低
public int fun(int n){
if (n < 1) {
throw new IllegalArgumentException("不能小於1");
}
if (n == 1 || n == 2) {
return n;
}
return fun(n-2) + fun(n-1);
}
//循環實現
public int loop(int n){
if (n < 1) {
throw new IllegalArgumentException("不能小於1");
}
if (n == 1 || n == 2) {
return n;
}
int two = 2;//初始化爲走到第二級的走法
int one = 1;//初始化爲走到第1級的走法
int sum = 0;
for (int i = 3;i<=n;i++){
//最後跨2步 + 最後跨一步的算法
sum = one + two;
one = two;
two = sum;
}
return sum;
}
@Test
public void test(){
long startTime = System.currentTimeMillis();
System.out.println(fun(40));//165580141
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);//338
}
@Test
public void test1(){
long startTime = System.currentTimeMillis();
System.out.println(loop(40));//1318412525
long endTime = System.currentTimeMillis();
System.out.println(endTime - startTime);//0
}
}