java递归解决39级台阶

39级台阶递归问题
本文通过递归算法解决了39级台阶问题,探讨了从起点到终点所有可能的步数组合,并验证了总步数必为偶数的特性。

期末复习递归时想到39级台阶这道题。


 
package recurion;

/**
 * @author hpc
 * @Date:2018-6-27下午7:18:32
 * 功能:递归实现39级台阶问题,由于左脚开始右脚结束所以总步数为偶数。
 */
public class TaiJie_39 {
	
	static int count = 0;//设置成员变量对走的步数计数,初始值为0.
	
	public static void main(String[] args) {
		
		f(39,0);
		
		System.out.println(count);
	}
	static void f(int stairs,int steps){
		
		if(stairs<0)return;
		
		if(stairs==0){//如果还剩的台阶数是0,则表示走完了,则对总步数是否是偶数进行判断
			
			if(steps%2==0){//如果是偶数,count加一
				
				count++;
			}
			return;
		}	
		f(stairs-1,steps+1);
		f(stairs-2,steps+1);//剩下的stairs如果不是0的话有两种走法
	}
}

 

package recurion;

/**
 * @author hpc
 * @Date:2018-6-27下午7:18:32
 * 功能:递归实现39级台阶问题,由于左脚开始右脚结束所以总步数为偶数。
 */
public class TaiJie_39 {
	
	static int count = 0;//设置成员变量对走的步数计数,初始值为0.
	
	public static void main(String[] args) {
		
		f(39,0);
		
		System.out.println(count);
	}
	static int f(int stairs,int steps){
		
		if(stairs==1){
			
			if(steps%2!=0){
				
				return count++;
			}
			else
				return 0;
		};
		if(stairs==0){
			
			if(steps%2==0){
				
				return count++;
			}
			else
				return 0;			
			
		}	
		return f(stairs-1,steps+1)+f(stairs-2,steps+1);
	}
}

因为左脚先上最后以右脚结束,所以必定是偶数步,这是最终的判断条件。以四个台阶为例,根据递归查找最终有两种可能。

<think>我们正在讨论青蛙跳台阶问题的递归实现。根据引用[1]、[3]和[5],青蛙跳台阶问题是一个经典的递归问题。问题描述如下:一只青蛙一次可以跳上1台阶,也可以跳上2台阶。求该青蛙跳上一个n台阶总共有多少种跳法。 递归思路: 1. 当台阶数n=1时,只有1种跳法(直接跳1)。 2. 当台阶数n=2时,有2种跳法(连续跳两次1,或者一次跳2)。 3. 对于n>2的情况,青蛙在第一次跳的时候有两种选择: - 跳1,此时剩下的台阶数为n-1,跳法为f(n-1) - 跳2,此时剩下的台阶数为n-2,跳法为f(n-2) 因此,总的跳法为f(n) = f(n-1) + f(n-2) 这实际上就是斐波那契数列。 引用[3]和[5]给出了递归实现的Java代码。下面我将根据这些引用,整理出一个完整的递归实现示例,并简要说明。 ### Java递归实现青蛙跳台阶问题 ```java public class FrogJump { // 递归方法 public static int jump(int n) { if (n == 1) { return 1; } else if (n == 2) { return 2; } else { return jump(n - 1) + jump(n - 2); } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入台阶数:"); int n = scanner.nextInt(); System.out.println(n + "阶台阶一共有" + jump(n) + "种跳法"); } } ``` #### 代码说明: 1. `jump`方法是递归函数,参数`n`表示台阶数。 2. 当`n=1`时,返回1(只有1种跳法)。 3. 当`n=2`时,返回2(有2种跳法)。 4. 当`n>2`时,返回`jump(n-1) + jump(n-2)`,即跳1后剩下的台阶跳法与跳2后剩下的台阶跳法之和。 #### 注意: 递归实现虽然简洁,但存在重复计算的问题。例如,计算`jump(5)`时会计算`jump(4)`和`jump(3)`,而计算`jump(4)`时又会计算`jump(3)`和`jump(2)`,这样`jump(3)`就被重复计算了。当n较大时,重复计算会很多,效率较低。 ### 优化: 可以考虑使用动态规划(非递归)或记忆化递归来优化。引用[2]和[4]给出了非递归(迭代)的实现方式,通过保存中间结果避免了重复计算。 ### 示例:非递归实现(迭代) ```java public static int frogJump(int n) { if (n == 1 || n == 2) { return n; } int a = 1; // 表示f(n-2) int b = 2; // 表示f(n-1) int c = 0; // 表示f(n) for (int i = 3; i <= n; i++) { c = a + b; a = b; b = c; } return c; } ``` ### 总结: 递归实现青蛙跳台阶问题代码简单,容易理解,但效率不高,适合小规模问题。对于大规模台阶数,建议使用迭代方法或记忆化递归。 §§相关问题§§ 1. 青蛙跳台阶问题的递归实现存在什么缺点? 2. 如何优化青蛙跳台阶问题的递归算法? 3. 除了跳1和2,如果青蛙可以跳更多(如3、4等),递归公式应该如何修改? </think>### Java递归实现青蛙跳台阶问题 青蛙跳台阶问题是一个经典的递归算法问题,描述如下:一只青蛙一次可以跳上1或2台阶,求跳上n台阶有多少种跳法。 #### 递归实现原理 设$f(n)$为跳上n台阶的跳法数量: 1. $n=1$时:$f(1)=1$(直接跳1) 2. $n=2$时:$f(2)=2$(连续跳两次1,或直接跳2) 3. $n≥3$时:$f(n) = f(n-1) + f(n-2)$ (第一次跳1时剩余$n-1$,第一次跳2时剩余$n-2$) #### Java递归实现代码 ```java public class FrogJump { public static int jump(int n) { if (n == 1) { return 1; // 基础情况1 } else if (n == 2) { return 2; // 基础情况2 } else { return jump(n - 1) + jump(n - 2); // 递归调用 } } public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入台阶数 n: "); int n = scanner.nextInt(); System.out.println(n + "阶台阶共有 " + jump(n) + " 种跳法"); } } ``` #### 代码说明 1. **递归终止条件**: - 当$n=1$时返回1 - 当$n=2$时返回2 2. **递归逻辑**: - 对于$n \geq 3$的情况,分解为$jump(n-1) + jump(n-2)$ 3. **时间复杂度**:$O(2^n)$(存在重复计算) 4. **空间复杂度**:$O(n)$(递归栈深度) #### 执行示例 - 输入:`n=3` → 输出:3 (跳法:1+1+1, 1+2, 2+1) - 输入:`n=4` → 输出:5 (跳法:1+1+1+1, 1+1+2, 1+2+1, 2+1+1, 2+2) ### 优化建议 递归实现虽然简洁,但存在重复计算问题(如计算$jump(5)$时需要重复计算$jump(3)$)。可采用以下优化: 1. **记忆化递归**:用数组存储已计算结果 2. **迭代法**:使用循环代替递归(参考引用[2]和[4]) 3. **动态规划**:自底向上计算避免递归开销 [^1]: 青蛙跳台阶递归思路分析 [^2]: 非递归实现代码参考 [^3]: 基础递归实现 [^4]: 迭代法优化实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值