一、初级版
一只青蛙跳台阶,一次可以跳1阶,可以2阶。那么,台阶为n时,有多少种法?
分析
由于一次只能跳一阶或者两阶,所以:
台阶数为1时:只有一种跳法,f(1)=1;
台阶数为2时:可以一阶一阶跳,也可以一次跳上去,所以f(2)=2;
台阶数为3时:当青蛙第一次跳 1 级台阶时,还剩下 n - 1个台阶,就还剩下 f(n - 1)种跳法;当青蛙第一次跳 2 阶台阶时,还剩下 n - 2 个台阶,就还剩下 f(n - 2)种跳法。所以f(3) = f(2) + f(1).
…
台阶数为n时:如果有n阶时,最后一步青蛙只能从第n-1或者n-2这两种情况往上跳。至于f(n-1)和f(n-2)为多少,我们并不关心,只需要将它们向下递归就可以了。
代码:
import java.util.Scanner;
public class TestDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(n+"级台阶共有:"+jump(n)+"种跳法");
}
public static int jump(int n) {
if(n==1) {
return 1;
}
if(n==2) {
return 2;
}
return jump(n-1)+jump(n-2);
}
}
//输入n=3
3级台阶共有:3种跳法
二、进阶版
一只青蛙跳台阶,一次可以跳1阶,可以2阶,一次也可以直接跳n阶。那么,台阶为n时,有多少种跳法?
分析
假设一共有n阶,青蛙在最后一步时可以从n-1阶往上跳,也可以n-2阶,也可以n-3…等等等,依次类推,则有:
f(n) = f(n-1) + f(n-2)+...+ f(2 )+ f(1) //式1
同理
f(n-1) = f(n-2)+f(n-3) + .. + f(2) + f(1) //式2
所以就可将式1中的 f(n-2)+…+ f(2 )+ f(1)换成 f(n-1),然后就得到了:
f(n) = 2f(n-1)
代码:
import java.util.Scanner;
public class TestDemo {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(n+"级台阶共有:"+jump(n)+"种跳法");
}
public static int jump(int n) {
if(n == 1) {
return 1;
}
return 2*jump(n-1);
}
}
//输入n=3
3级台阶共有:4种跳法