本文主要是介绍兴趣题:猴子吃桃问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
兴趣题:猴子吃桃问题
有一堆桃子不知数目,猴子第一天吃掉一半,又多吃了一个,第二天照此方法,吃掉剩下桃子的一半又多一个,天天如此,到第m天早上,猴子发现只剩一只桃子了,问这堆桃子原来有多少个?
思考:使用循环(无函数调用)、普通函数调用、 递归函数调用解决
题目解析
思路:我们可以采用逆向思维,假设第十天剩一个,前一天则为 S 9 = ( S 10 + 1 ) ∗ 2 S9 = (S10 +1)*2 S9=(S10+1)∗2,以此推算前一天。
S n = 1 ; S n − 1 = ( S n + 1 ) ∗ 2 = 4 S n − 2 = ( S n − 1 + 1 ) ∗ 2 = 10 . . . S 1 = ( S 2 + 1 ) ∗ 2 = ? S_{n}=1;\\ S_{n-1}=(S_{n}+1)*2=4\\ S_{n-2}=(S_{n-1}+1)*2=10\\ ...\\ S_{1}=(S_{2}+1)*2=?\\ Sn=1;Sn−1=(Sn+1)∗2=4Sn−2=(Sn−1+1)∗2=10...S1=(S2+1)∗2=?
需要求解 S 1 S_1 S1为多少,即为原来的桃子数.
循环
循环体: S n = ( S n + 1 + 1 ) ∗ 2 S_n=(S_{n+1}+1)*2 Sn=(Sn+1+1)∗2
初始值: S n = 1 S_{n}=1 Sn=1
循环次数: n − 1 n-1 n−1(这里值得注意,第n天为1,往前找n-1次即可得到第一天的值)
while 循环
#include<stdio.h>
int main()
{int n,i,S,k;printf("Enter n(day): ");scanf("%d",&n);k=n;//纪录天数 S=1;//最后剩下一个 while(n!=1){S=(S+1)*2;n--;}printf("%d天吃剩一个的桃子总数为:%d",k,S); return 0;
}
for循环
include <stdio.h>
int main(){int n,s=1,i; //n为天数,s为最后留下的scanf("%d",&n);for(i=0;i<n-1;i++)s=(s+1)*2;printf("%d",s);
}
普通函数调用
只要将循环部分整合成函数即可
#include <stdio.h>
int func(int num);//函数声明
int func(int num)
{int i,reslut=1;for(i=0;i<num-1;i++)reslut=(reslut+1)*2;return reslut;
}int main(){int n; //n为天数scanf("%d",&n); printf("%d",func(n));
}
递归函数调用
#include<stdio.h>
int eat(int N);
int main()
{int N,num;scanf("%d",&N);printf("%d",eat(N));return 0;
}
int eat(int N)
{if(N==1) return 1;return (eat(N-1)+1)*2;//调用自己}
}
这篇关于兴趣题:猴子吃桃问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!