【递归与迭代】

题目:有n步台阶,一次只能上1步或者2步,共有多少种走法

递归

  • 递归分析:
台阶数备注走法数
1走1步,f(1) = 11
21步+1步||2步,f(2) = 22
3最后可以走1步或者两步,相当于f(2) + 1步 或者 f(1) + 2步f(1) + f(2)
n最后可以走1步或者两步,相当于f(n-2) + 2步 或者 f(n-1) + 1步f(n-1) + f(n-2)
  • 递归代码实现:
public class Demo {
    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        System.out.println("走法:" + f(40));
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start) + "ms");
    }

    public static int f(int n) {
        if (n < 1) {
            throw new IllegalArgumentException("n不能小于1");
        }
        if (n == 1 || n == 2) {
            return n;
        }
        return f(n - 2) + f(n - 1);
    }
}
  • 递归结果:
走法:165580141
耗时:308ms

迭代

  • 迭代分析:

lastOneNum–保存最后走一步之前的步数

lastTwoNum–保存最后走两步之前的步数

台阶数备注走法数
11步f(1) = 1
21步+1步||直接2步,f(2) = 2
3(1)先到达f(1),然后从f(1)跨2步
(2)先到达f(2),然后从f(2)跨1步
f(3) =lastTwoNum+lastOneNum
f(3)=f(1) +f(2)
lastTwoNum=f(1);lastOneNum=f(2)
4(1)先到达f(2),然后从f(2)跨2步
(2)先到达f(3),然后从f(3)跨1步
f(4) =lastTwoNum+lastOneNum
f(4)=f(2) +f(3)
lastTwoNum=f(2);lastOneNum=f(3)
  • 迭代代码:
public class Demo {

    public static void main(String[] args) {
        long start = System.currentTimeMillis();
        System.out.println("走法:" + f2(40));
        long end = System.currentTimeMillis();
        System.out.println("耗时:" + (end - start) + "ms");
    }

    public static int f2(int n) {
        if (n < 1) {
            throw new IllegalArgumentException("n不能小于1");
        }
        if (n == 1 || n == 2) {
            return n;
        }
        int lastTwoNum = 1; //初始化为走到第一级台阶的走法
        int lastOneNum = 2; //初始化为走到第二级台阶的走法
        int sum = 0;

        for (int i = 3; i <= n; i++) {
            sum = lastTwoNum + lastOneNum;//例如:3个台阶走法=走到1级台阶(剩2级)走法+走到2级(剩1级)台阶走法
            lastTwoNum = lastOneNum;//当i+1后,剩2级走法=之前剩1级台阶的走法
            lastOneNum = sum;//当i+1后,剩1级台阶走法=之前走法总数
        }
        return sum;
    }
  • 迭代结果
走法:165580141
耗时:0ms
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值