(示例实战)当我们在说递归和迭代时,到底在说什么? 编程题:有n步台阶,一次只能上1步或2步,共有多少种走法?

编程题:有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));
	}
}

猜你喜欢

转载自blog.csdn.net/u010425839/article/details/115220530