小孩吃梨问题:小孩买了一些梨,当即吃了一半,又多吃了一个,第二天早上又将剩下的梨吃掉一半,又多吃了一个。 以后每天早上都吃了前一天剩下的一半,并又多吃了一个。到第18天只剩下一个梨了,问共买多少梨?

首先此类问题一般作为引入递归法启蒙题,因为这个小孩每天吃梨的这个行为及吃梨的规律都是相当于同一特性被重复执行,即当某一特性被重复执行时就可以考虑递归算法。
递归算法是一种程序调用自身的编程技巧,其实也就是特殊的方法调用,方法调用自己。
但是自己调用自己的话其实是个死循环,容易栈内存溢出,程序就死亡了。
故有这两个注意事项。
1:使用递归先确定有个出口!出口:“条件满足时,不再递归了。”
2:递归一般是把规模较大的逐渐转为相同问题,规模越来越小,直到出口!

这个小孩吃梨问题则可以这样分析。
/
计算第几天有多少梨,天数<=18 >=1天
days 指定要求的天数
return 返回这一天的梨数量
/

递归代码:

int getPear(int days)
{
	if(days == 18)
	{
		return 1;
	}
	return (getPear(days+1)+1)*2;
}

*1:出口:days = 18, 梨确定为1个
2:规律:
/

getPear(n) = (getPear(n+1)+1)*2
假设n = 9,第9天的量 = (第10天的量+1)2
/

在这里插入图片描述
完整代码:

#include<stdio.h>
int getPear(int days);
int main()
{
	int n,m;
	printf("请输入你想计算梨数量的天数:");
	scanf("%d",&n); 
	m = getPear(n-1);    //因为第一天的时候也吃了 
	if(n == 1)
	printf("小孩总共买了%d个梨.",m);
	else 
	printf("第%d天的梨数量为:%d",n,m);
	return 0;	
} 
 int getPear(int days)
{
  if(days==18)
  {
  	return 1;
  }
  return (getPear(days+1)+1)*2;
}

题目中要求计算小孩总共买了多少梨,其实也就可以看作是第一天所买的梨.
下面还有一种方法也就是常见的倒推法:
倒推法又被称为递推法,从第一天开始循环直到第十八天,然后以x = (x+1) * 2的方式进行迭代,最终到第十八次循环的时候算到第一天,也就算出了小孩买梨的总数目.
完整代码如下:

#include<stdio.h>
int function()
{
int i;
int x=1;
for(i=1;i<=18;i++)
x=(x+1)*2;
return x;
}
int main()
{
printf("这个小孩总共买的梨的数量:"); 
printf( "%d",function());
return 0;
}

上述两种方法,第一种是递归,第二种是迭代,递归更适用于计算机进行试别,而迭代更适用于我们自己进行使用及识别。

猜你喜欢

转载自blog.csdn.net/RViewSonic/article/details/107578513