问题分析: 看到这个问题首先想到的递归 定义一个方法 int F( int n ) 不考虑其具体实现 我们令其可以实现返回这道题的解
; 继续分析这道题的解集,有一点是可以确定的: 在解集中小明跨出的第一步有两种情况①第一步跨越两个阶梯②第一步跨越一个阶梯 那么 问题的规模得以减小 我们很容易得到公式: F(n)=F(n-1)+F(n-2)
接下来考虑递归的出口问题:
当n=0这个问题不能被分解(原子问题)并得到一个解则 return 1;
当n<0这个问题无解则 return 0 .
可得到以下递归函数:
int F(int n) {
if(n==0) {
return 1;
}
if(n<=0) {
return 0;
}
return F(n-1)+F(n-2);
}
目前为止我们并没有将偶数步的要求考虑在内, 要在递归函数内解决这个问题显然F( ) 仅有一个参数是不够的 思考之后可以增加一个boolean类型的参数mark 表示步数的奇偶
每走一步(每一次递归调用)就将mark的值取反 我这里设置mark的初始值为false 那么显然就要求当n==0且mark=false时 我们就寻找到了问题的一个解 return 1, 否者 return 0 ;
所以 改进后的方法 F () 为:
int F(int n,boolean mark) {
if(n==0&&mark==false) {
return 1;
}
if(n<=0) {
return 0;
}
return F(n-1,!mark)+F(n-2,!mark);
}
附上源码:
public class Main {
public static void main(String[] args) {
boolean a = false;
System.out.println(F(39,a));
}
public static int F(int n,boolean mark) {
if(n==0&&mark==false) {
return 1;
}
if(n<=0) {
return 0;
}
return F(n-1,!mark)+F(n-2,!mark);
}
}
此递归的执行过程类似于二叉树的先序遍历 下图是转自博客:
http://blog.youkuaiyun.com/qsyzb/article/details/18991233