登楼梯——递归设计
楼梯有n阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算有多少种走完楼梯的方式。
首先定义函数int f(int n)的宏观语义是返回小白走完n阶台阶的方式数。
其次寻找出规模更小的子问题。尝试逆向思考,假设小白已经到达第n阶台阶上。那么小白上一步所在的位置在哪?因为小白可以踏出三种步伐,所以小白到达第n阶台阶时的上一位置的情况如下图所示,共三种。
事实上,到这一步规模更小的子问题已经显现出来了。即f(n) = f(n - 1) + f(n - 2) + f(n - 3)
最后注意递归终止条件即可完成递归函数设计。
import java.util.Scanner;
/*
* 楼梯有n阶,小白一次可以上1阶,2阶或者3阶,实现一个方法,计算有多少种走完楼梯的方式。
*/
public class 上楼梯 {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
System.out.println(f(n));
}
// 返回登上n阶台阶的方式数
private static int f(int n) {
if (n == 1) {
return 1;
}
if (n == 2) {
return 2;
}
if (n == 3) {
return 4;
}
return f(n - 1) + f(n - 2) + f(n - 3);
}
}
时间复杂度很大:O(3^n)