编程题:有n步台阶,一次只能上1步或2步,共有多少种走法?
1.递归 recursion 递归自己调自己,注意方法出口,频繁入栈出栈比较耗时,可能会导致栈溢出
2.迭代 iteration 迭代就是拿一套计算逻辑一直不停的循环计算,但是每循环一次都会把上一次循环计算的结果当成下次循环的参数,比较高效
推导过程:
n=1 [1] f(1)=1
n=2 [1,1] [2] f(2)=2
n=3 [1,1,1] [1,2] [2,1] f(3)=3
n=4 [1,1,1,1] [1,1,2] [1,2,1] [2,1,1] [2,2] f(4)=5
n=5 [1,1,1,1,1] [1,1,1,2] [1,1,2,1] [1,2,1,1] [2,1,1,1] [1,2,2] [2,1,2] [2,2,1] f(5)=8
f(1)=1
f(2)=2
f(3)=f(2)+f(1)=2+1=3
f(4)=f(3)+f(2)=3+2=5
f(5)=f(4)+f(3)=5+3=8
f(x)=f(x-1)+f(x-2)
public class RecursionAndIteration {
//1.递归:自己调自己,注意方法出口,频繁入栈出栈比较耗时,可能会导致栈溢出
public static int recursionGet(int n){
if(n==1||n==2){
return n;
}else{
return recursionGet(n-1)+recursionGet(n-2);
}
}
//2.循环迭代:比较高效
public static int iterationGet(int n){
int sum = 0;
if(n==1||n==2){
sum = n;
}else{
for(int i = 3,s1=1,s2=2; i <=n; i++){
sum = s1 + s2;
s1 = s2;
s2 = sum;
}
}
return sum;
}
public static void main(String[] args) {
long start1 = System.currentTimeMillis();
System.out.println("递归结果:" + recursionGet(40));
long end1 = System.currentTimeMillis();
System.out.println("递归耗时:" + (end1-start1));
long start2 = System.currentTimeMillis();
System.out.println("迭代结果:" + iterationGet(40));
long end2 = System.currentTimeMillis();
System.out.println("迭代耗时:" + (end2-start2));
}
}