
问题分析: 看到这个问题首先想到的递归 定义一个方法 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

本文通过递归方法解决了一个特定的问题:小明如何在确保总步数为偶数的情况下登上n级阶梯。文章详细解释了递归函数的设计思路,并通过增加一个标记参数来控制步数的奇偶性。





