编程题:有n步台阶,一次只能上1步或2步,共有多少中走法
方法一:递归
思路
n=1 ——> 一步 ——> f(1)=1
n=2 ——> (1)一步一步 (2)直接两步 ——> f(2) =2
n=3 ——> (1)先到达第f(1),然后直接从f(1)直接跨2步
(2)先到达f(2),然后直接从f(2)跨步1 f(3)=f(1)+f(2)
n=x ——>(1) 先到达f(x-2),然后从f(x-2)直接垮2步
(2) 先到达f(x-1),然后从f(x-1)跨1步 f(x) =f(x-2)+f(x-1)
代码
public static void main(String[] args) {
Long start = System.currentTimeMillis();
System.out.println(f(40l));
Long end = System.currentTimeMillis();
System.out.println(end-start);
}
public static Long f(Long n){
if(n <1)
throw new IllegalArgumentException(n +"不能小于1");
if(n == 1 || n == 2){
return n;
}
return f(n-2)+f(n-1);
}
优点:代码精简 易懂,容易编写。
缺点:开销较大,容易造成内存溢出
方法二:迭代
思路:使用one变量存储前两步的值,使用two变量存储前一步的值
代码
public static void main(String[] args) {
Long start = System.currentTimeMillis();
System.out.println(f(40l));
Long end = System.currentTimeMillis();
System.out.println(end-start);
}
public static Long loop(Long n){
if(n <1)
throw new IllegalArgumentException(n +"不能小于1");
if(n == 1 || n == 2){
return n;
}
Long one = 1l;
Long two = 2l;
Long sum = 0l;
for(int i = 3;i<=n;i++){
sum = one + two;
one = two;
two = sum;
}
return sum;
}
优点:速率快。
缺点:代码不易懂。