问题描述

猴子吃桃问题。猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第二天又将剩下的桃子吃掉了一半,又多吃了一个。以后每天将前一天剩下的桃子吃掉一半,再多吃一个。直到第十天只剩下一个桃子了,求第一天共摘了多少个桃子。

 

思路

假设第一天猴子摘了X个桃子,那么第一天猴子把桃子吃了一半又吃了一个,也就是说剩余了 Y = X/2 -1 个桃子。思考一下X与Y的关系,便可依次推出往后每天桃子剩余的数量,因为往后每天都是“将前一天剩下的桃子吃掉一半,再多吃一个”。

解 Y = X/2 -1方程,可得 X = (Y+1)*2 

#include<stdio.h>
int fun(int n)
{
	if(n==10)
		return 1;
	else
	{
		return (1+fun(n+1))*2;
	}
}
void main()
{
	printf(\"%d\\n\",fun(0));
}

\"\"

程序写完了,但是有没有对呢?因为天数较少,我们可以用笔把问题的解列出来与程序的结果对照一下:)

 

10 9 8 7 6 5 4 3 2 1
1 4 10 22 46 94 190 382 766 1534

 

O_o  为啥算得第1天是1534呢?而我们程序的结果是3070。

—  —    因为按照用笔递推的方式,推出的每一天的桃子个数都是当天剩余的,那么推到第1天剩余了1534个确实没错,但这不是摘下来的个数,摘下来的个数等于用1534再推一次得出的3070。

收藏 打印