算法! 有n步台阶,一次只能上1步或2步,共有多少种走法

有2种算法, 递归和循环迭代, 依次介绍并比较

1.递归

1步台阶, 一种走法, 即f(1)=1;
2步台阶, 2种走法, 一步加一步或是直接跨两步, 即f(2)=2
3步台阶, 最后一次要么跨1步,要么跨2步, 一共的走法为最后一次跨1步的走法f(3-1)加上最后一次跨2步的走法f(3-2), 即f(3)=f(2)+f(1)

n步台阶, 最后一次跨1步的走法f(n-1)加上最后一次跨2步的走法f(n-2), 即f(n)=f(n-1)+f(n-2)

public class StepCount {

    private static int f(int n) {
        if (n == 1 || n == 2) {
            return n;
        } else {
            return f(n - 1) + f(n - 2);
        }
    }

    public static void main(String[] args) {
        long startTime = System.currentTimeMillis();    //记录初始时间
        System.out.println(f(40));
        long endTime = System.currentTimeMillis();      //记录终末时间
        System.out.println("所用时间: " + (endTime - startTime) + " 毫秒");
    }
}

走40步台阶耗时256毫秒
算法! 有n步台阶,一次只能上1步或2步,共有多少种走法_第1张图片

2.循环迭代

private static int f(int n) {
    if (n == 1 || n == 2) {
        return n;
    }
    //初始化为走到第二级台阶的走法
    int one = 2;
    //初始化为走到第一级台阶的走法
    int two = 1;
    int sum = 0;
    for (int i = 3; i <= n; i++) {
        //最后跨两步+最后跨一步的走法
        sum = two + one;
        two = one;	//之前到目标阶跨一步的走法变成到下一目标阶跨两步的走法
        one = sum;	//之前到目标阶的走法变成到下一目标阶跨一步的走法
    }
    return sum;
}

同样走40步台阶, 耗时0毫秒
算法! 有n步台阶,一次只能上1步或2步,共有多少种走法_第2张图片

递归与循环迭代的比较

递归简洁、易于理解, 但是浪费空间、效率低下(从图中看出相对耗时更久)
迭代正好反之, 不够简洁, 可读性较差, 但是效率更高, 不易造成堆栈溢出

你可能感兴趣的:(算法! 有n步台阶,一次只能上1步或2步,共有多少种走法)