台阶算法
编程题-台阶算法
有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
四、小结
方法调用自身称为递归,利用变量的原值推出新值称为迭代。
-
递归
优点:大问题转化为小问题,可以减少代码量,同时代码精筒,可读性好;缺点:递归调用浪费了空间,而且递归太深容易造成堆栈的溢出。
-
迭代
优点:代码运行效率好,因为时间只因循环次数增加而增加,而且没有额外的空间开销;
缺点:代码不如递归简洁,可读性好

浙公网安备 33010602011771号