每周算法题(猴子吃桃问题,有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完.)

每周算法题


猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。

可以结合这一篇一起看–猴子吃桃

  1. 第10天为1个桃子
  2. *第9天为(1+1)2,也就是4个桃子
  3. *第8天为(4+1)2,也就是10个桃子
  4. 以此类推…

得出公式,n天数目等于(n-1天数目+1)*2

递归

int getPeaches(int day)
{
	if (day==10)
	{
		return 1;
	}

	return (getPeaches(day + 1) + 1) * 2;
}

void main()
{
	int day = 1;
	int res=getPeaches(day);

	printf("%d", res);
}


return (getPeaches(day + 1) + 1) * 2;这句话是代码的核心.它的意思是我要知道前一天的数目,必须要先知道它后面一天的数目.因为题目只给了后面一天的数目,所以我们只能反向推.
第九天的数目就是(第十天的数目+1)X2

常规写法

void main()
{
	int day = 10;
	int num = 1;

	while (day>1)
	{
		num = (num + 1) * 2;
		day--;
	}

	printf("%d", num);
}

有1020个西瓜,第一天卖一半多两个,以后每天卖剩下的一半多两个,问几天以后能卖完.

非递归

void main()
{
	int day = 1;
	int num = 1020;
	int res;

	while (num)
	{
		num = num / 2 - 2;
		day++;
	}

	printf("%d", day);
}

结果为9,那到底正不正确,我们还可以用递归来考证一下

int getWaterNum(int day)
{
	if (day==9)
	{
		return 0;
	}
	return (getWaterNum(day + 1) + 2) * 2;
}

void main()
{
	int day = 1;
	int num = 1020;
	int res;

	while (num)
	{
		num = num / 2 - 2;
		day++;
	}

	res = getWaterNum(1);

	printf("%d\n", res);
	printf("%d", day);
}



答案是1020,证明答案正确

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值