每周算法题
文章目录
猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
可以结合这一篇一起看–猴子吃桃
- 第10天为1个桃子
- *第9天为(1+1)2,也就是4个桃子
- *第8天为(4+1)2,也就是10个桃子
- 以此类推…
得出公式,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,证明答案正确