You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
如题:climbStair(n)= climbStair(n-1) + climbStair(n-2) ,这是什么?斐波那契数列啊,竟然没反应上来,随后就递归的写了斐波那契数列的实现,当然错啦,不是在算法,而是递归结构不对,才当n=44,就time limit exceeded!
翻了一下答案,应用迭代计算结果,并把每种结果存入数组,最后返回a[n],很好。。。
照例先上代码
<pre name="code" class="java">public int climbStair(int n){
//递归写法
<span style="font-family: Arial, Helvetica, sans-serif;">if(n==0||n<0){</span>
return 0; }
if(n==1){return 1;}
if(n==2){return 2;}
return climbStair(n-1) + climbStair(n-2);
}
public int climbStairs(int n){
<span style="white-space:pre"> </span>//迭代,数组存储写法
int[] a = new int [n+1];
a[0] = 1;
a[1] = 1;
for(int i=2;i<a.length;i++){
a[i] = a[i-1] + a[i-2];
}
return a[n];
}
测试代码:
long t1=System.currentTimeMillis();
System.out.println(cs.climbStair(44));
long t2=System.currentTimeMillis();
System.out.println(t2-t1);
long t3=System.currentTimeMillis();
System.out.println(cs.climbStairs(44));
long t4=System.currentTimeMillis();
System.out.println(t4-t3);
运行结果:
1134903170
15667 //递归写法所用的时间
1134903170
0 //迭代写法所用的时间,几乎为零
两者差距很大,想想递归为甚么会如此的消耗时间,递归同时也消耗内存资源,这倒底是怎么回事?在哪里消耗?