台阶算法

编程题-台阶算法

有n个台阶,一次只能上1步或2步,共有多少中走法?

一、递归

n 步骤 结果f(n)
1 一步 f(1)=1
2 (1)一步一步(2)2步 f(2)=2
3 (1)先到达f(1),然后直接跨2步(2)先到达f(2),然后跨1步 f(3)=f(1)+f(2)
4 (1)先到达f(2),然后直接跨2步(2)先到达f(3),然后跨1步 f(4)=f(2)+f(3)
... ... ...
n (1)先到达f(n-2),然后直接跨2步(2)先到达f(n-1),然后跨1步 f(n)=f(n-2)+f(n-1)

二、循环迭代

one保存最后一步,two保存最后走两步。

n 步骤 结果f(n)
1 一步 f(1)=1
2 (1)一步一步(2)2步 f(2)=2
3 (1)先到达f(1),然后直接跨2步(2)先到达f(2),然后跨1步 f(3)=two+one f(3)=f(1)+f(2) two=f(1),one=f(2)
4 (1)先到达f(2),然后直接跨2步(2)先到达f(3),然后跨1步 f(3)=two+one f(4)=f(2)+f(3) two=f(2),one=f(3)
... ... ...
n (1)先到达f(n-2),然后直接跨2步(2)先到达f(n-1),然后跨1步 f(n)=two+one f(n)=f(n-2)+f(n-1) two=f(n-2),one=f(n-1)

三、代码示例

递归代码示例:

import java.util.Scanner;

public class Step1 {
    public static void main(String[] args) {
        System.out.print("请输入台阶数n:");
        Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();
        System.out.println(i+"个台阶"+"共有"+f(i)+"走法");
    }
    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);
    }
}

递归运行结果:

"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" "-javaagent:E:\JAVA\idea\IntelliJ IDEA  com.demo.Step1
请输入台阶数n:10
使用递归方法:10个台阶共有89走法

Process finished with exit code 0

循环迭代代码示例:

import java.util.Scanner;

public class Step2 {
    public static void main(String[] args) {
        System.out.print("请输入台阶数n:");
        Scanner scanner = new Scanner(System.in);
        int i = scanner.nextInt();
        System.out.println("使用循环方法:"+i+"级台阶"+"共有"+f(i)+"走法");
    }
    public static int f(int n){
        if (n<1){
            throw new IllegalArgumentException("n不能小于1");
        }
        if (n==1 || n==2){
            return n;
        }
        //one为走到第二级台阶的走法
        int one = 2;
        //two为走到第一级台阶的走法
        int two = 1;
        int sum = 0;
        for (int i=3;i<=n;i++){
            //最后跨2步+最后跨1步
            sum = two + one;
            two = one;
            one = sum;
        }
        return sum;
    }
}

循环迭代运行结果:

"C:\Program Files\Java\jdk1.8.0_171\bin\java.exe" "-javaagent:E:\JAVA\idea\IntelliJ IDEA com.demo.Step2
请输入台阶数n:10
使用循环方法:10级台阶共有89走法

Process finished with exit code 0

四、小结

方法调用自身称为递归,利用变量的原值推出新值称为迭代。

  1. 递归
    优点:大问题转化为小问题,可以减少代码量,同时代码精筒,可读性好;

    缺点:递归调用浪费了空间,而且递归太深容易造成堆栈的溢出。

  2. 迭代
    优点:代码运行效率好,因为时间只因循环次数增加而增加,而且没有额外的空间开销;
    缺点:代码不如递归简洁,可读性好

posted @ 2022-05-27 17:29  の南归  阅读(432)  评论(0)    收藏  举报