猴子吃桃子

本文通过递归算法解决了一个经典的数学问题——猴子摘桃。该问题要求计算猴子最初摘取的桃子数量,通过逆向思维及递归方法,给出了两种不同的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

猴子在第一天摘了若干个桃子,吃了一半后,不过瘾,又吃了一个。第二天又吃了剩下桃子的一半加1个。到第10天的时候,桃子还剩一个(第10天没有吃)。

问猴子最开始摘了多少个桃子?

 

这道题一看就是递归,且递推公式为:

K(n-1)/2 -1 = K(n)

但有意思的是结束条件是第10天而不是第1天,不符合一般递推应用”将复杂问题简单化“的理念。所以需要把题目转换一下:

假设猴子第一天摘了一个桃子,然后以某种规律继续摘,求第10天一共摘了多少桃子。

至于这个规律就是将上述公式变为K(n)/2 -1 = K(n-1),变化后得到:K(n)=(K(n)+1)*2.

 

public class Testing {

	public static void main(String[] args) {
		System.out.print(doTower(10));
	}

	private static int doTower(int n) {
		int i;
		
		if(n == 1){
			i = 1;
		}else{
			i = doTower(n-1)*2+2; -- 由于结束条件是第一天,因此递归公式应该从n归约到1,因此应该是n-1。
		}
		
		return i;
	}
}

 

或者直接用第10天作为接受条件也是可以的:

 

public class Testing {

	public static void main(String[] args) {
		System.out.print(doTower(1));
	}

	private static int doTower(int n) {
		int i;
		
		if(n == 10){
			i = 1;
		}else{
			i = doTower(n+1)*2+2; -- 由于结束条件是10,因此递归公式是从1递增到n,因此是n+1.
		}
		
		return i;
	}
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值