尚硅谷面试第一季-05递归与迭代

引出问题:

递归分析:

递归实现代码:

 1 package 递归与迭代;
 2 
 3 import org.junit.jupiter.api.Test;
 4 
 5 /**
 6  * @author zsh
 7  * @company wlgzs
 8  * @create 2019-03-27 15:58
 9  * @Describe 递归实现
10  * 有n阶台阶,1次只能上一步或者2步,有多少种走法
11  * 递归
12  * 迭代
13  */
14 public class TestStep {
15     @Test
16     public void test() {
17         long start = System.currentTimeMillis();
18         System.out.println(f(40)); //165580141
19         long end = System.currentTimeMillis();
20         System.out.println(end - start); //640ms
21     }
22 
23     //递归实现f(n):求n步台阶,一共有几种走法
24     public int f(int n) {
25         if (n < 1) {
26             throw new IllegalArgumentException(n + "不能小于1");
27         }
28         if (n == 1 || n == 2) {
29             return n;
30         }
31         return f(n - 1) + f(n - 2);
32     }
33 
34 }

运行结果:

 迭代分析:

迭代代码:

 1 package 递归与迭代;
 2 
 3 import org.junit.jupiter.api.Test;
 4 
 5 /**
 6  * @author zsh
 7  * @company wlgzs
 8  * @create 2019-03-27 16:16
 9  * @Describe 迭代实现
10  * 有n阶台阶,1次只能上一步或者2步,有多少种走法
11  * 递归
12  * 迭代
13  */
14 public class TestStep2 {
15 
16     @Test
17     public void test() {
18         long start = System.currentTimeMillis();
19         System.out.println(loop(40)); //165580141
20         long end = System.currentTimeMillis();
21         System.out.println(end - start); //<1ms
22     }
23 
24     public int loop(int n) {
25         if (n < 1) {
26             throw new IllegalArgumentException(n + "不能小于1");
27         }
28         if (n == 1 || n == 2) {
29             return n;
30         }
31         int one = 2; //走到第二级台阶的初始化值
32         int two = 1; //走到第一级台阶的初始化值
33         int sum = 0;
34 
35         //最后跨两步+最后跨一步的走法
36         for (int i = 3; i <= n; i++) {
37             sum = two + one;
38             two = one;
39             one = sum;
40         }
41         return sum;
42     }
43 }

运行结果:

小结:

原文地址:https://www.cnblogs.com/zsh-blogs/p/10608495.html