1、问题阐述
假设你现在正在爬楼梯,楼梯有 n级。每次你只能爬 1 级或者 2 级,那么你有多少种方法爬到楼梯的顶部?
2、解决思路
该问题的解决方法有两种,一个是利用斐波那契数列,即递归方法,另一种是利用动态规划方法。如果n值很大,递归方法耗时长。当值很大时,前者耗时是后者的成百上千倍,甚至前者会出现运行时间过长的异常现象。这是因为每一次递归,都要重新计算,导致耗时过长。
3、代码如下
package com.learn;
import javax.sound.midi.Soundbank;
public class UpstairsMethod {
public static void main(String[] args) {
System.out.println(getTotal(20)); // 10946
System.out.println(getTotal2(20)); // 10946
}
/**
* 递归方法
* @param step
* @return
*/
public static long getTotal(int step){
if(step <= 0){
return 0;
}
if(step <= 1){
return 1;
}
if(step == 2){
return 2;
}
return getTotal(step-1) + getTotal(step-2);
}
/**
* 动态规划
* @param step
* @return
*/
public static long getTotal2(int step) {
int i=1, j=2;
int k = 3; // 第三步
int sum = 0;
if (step <= 0){
return 0;
}
if(step <= 1) {
return i;
}
if(step == 2){
return j;
}
while (k <= step){
sum = i + j;
i = j;
j = sum;
k++;
}
return sum;
}
}
建议在解决该种问题时,采用动态规划的方法,避免当n值过大时,出现运行时间过长的异常。
ps:如有不足,期待您的指点,谢谢!