递归算法求猴子吃桃问题
猴子吃桃子问题大数据结构课程设计

标准文档目录1、 .................................................. 需求分析12、 .................................................. 概要设计12.1. 用数组数据结构实现上述求解 (1)2.2. 用链数据结构实现上述求解 (1)2.3用栈数据结构实现求解 (1)2.4用递归实现上述求解 (2)3、运行环境 (2)3.1硬件环境 (2)3.2软件环境 (2)4、详细设计 (2)4.1系统流程图 (2)4.2用数组数据结构实现上述求解 (3)4.3用链数据结构实现上述求解 (4)4.4用栈数据结构实现求解 (5)4.5用递归实现上述求解 (6)5、调试分析 (7)6、 .................................................. 运行结果7课程设计总结 (8)参考文献 (9)附录: (9)1、需求分析1、猴子吃桃子问题有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10 天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
要求:1) 采用数组数据结构实现上述求解2) 采用链数据结构实现上述求解3) 采用栈实现上述求解4) 采用递归实现上述求解2、概要设计2.1. 用数组数据结构实现上述求解在taozi 函数中定义一个一维数组,分别存储每天的桃子个数,根据题目的内容找出各个数之间的关系,用数组元素表示出来,根据用户输入要计算哪一天的桃子,用for 循环控制结束。
在main 函数中让用户输入要计算的哪一天,调用taozi 函数,以便用户可查出任意一天的桃子个数,用switch 语句判断用户要执行的功能,然后用while 循环控制,直到用户输入0 为止。
2.2. 用链数据结构实现上述求解先写出预定义常量和类型,写出结点的类型定义,创建结点,初始化链表,定义变量并初始化,找出结点与其后继结点之间的联系,然后在主函数中控制。
c语言经典案例1

题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了。
求第一天共摘了多少。
1.程序分析:采取逆向思维的方法,从后往前推断。
2.程序源代码:main(){int day,x1,x2;day=9;x2=1;while(day>0){x1=(x2+1)*2;/*第一天的桃子数是第2天桃子数加1后的2倍*/x2=x1;day--;}printf("the total is %d\n",x1);}-----------------------------------------------------------------------------【程序22】题目:两个乒乓球队进行比赛,各出三人。
甲队为a,b,c三人,乙队为x,y,z三人。
已抽签决定比赛名单。
有人向队员打听比赛的名单。
a说他不和x比,c说他不和x,z比,请编程序找出三队赛手的名单。
1.程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。
2.程序源代码:main(){char i,j,k;/*i是a的对手,j是b的对手,k是c的对手*/for(i='x';i<='z';i++)for(j='x';j<='z';j++){for(k='x';k<='z';k++){ if(i!=k&&j!=k){ if(i!='x'&&k!='x'&&k!='z')printf("order is a--%c\tb--%c\tc--%c\n",i,j,k);}}}}-----------------------------------------------------------------------------【程序23】题目:打印出如下图案(菱形)****************************1.程序分析:先把图形分成两部分来看待,前四行一个规律,后三行一个规律,利用双重for循环,第一层控制行,第二层控制列。
课程设计-猴子吃桃

湖南工学院数据结构课程设计题目:数据结构实现—猴子吃桃系别:专业:年级:班级:学生:学号:目录●论文提要 (3)●需求分析 (4)●详细设计 (5)⏹数组结构 (5)⏹递归 (7)⏹链表 (9)●调试结果 (11)●调试分析 (12)论文提要初步分析说明数据结构和抽象数类型等基本概念;从抽象数据类型的角度,通过数学应用的分析,把问题进行分析,整理,面后通过观察选择适当的逻辑结构、存储结构入及其相应的算法来解决问题,数据结构课程主要是为了培养我们对数据的抽象能力和对算法在时间和空间和复杂度上进行优化,猴子吃桃这一数学方面的例题是很典型的一道程序例题,在这里主要以C语言作为数据结构和描述语言,分析并采用数组数据结构,递归,链数据结构实现上述问题。
需求分析实现课题——猴子吃桃摘要:猴子吃桃这一典型的数学课题,其主要实现的过程是将其数学课题公式化,用一些简单的数据定义、初使化、通过一系列的条件判断和循环用来实现学数公式的计算机化。
通过C语言基础分析和数据结构初步了解,我们使用C语言,利用C和数据结构的结合使用,让我们在短时间内建立起对数据结构的进一步认识。
然后,形成正确的对算法和优有个的理解观念。
关键词:C语言的基本了解,数据结构的基本了解, 数据中数组的使用,递归调用,用C语言实现数据链表题目:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。
以后每天早上都吃了前一天剩下的一半零一个。
到第10天早上想再吃时,见只剩下一个桃子了,求第一天共摘了多少?要求:采用数组,递归,链数据结构实现上述求解详细设计1.数组结构把猴子吃桃的天数倒过来看的话,以天数作为数组的下标i,剩下桃子的个数a[i]的递推公式为a[i]=(a[i-1]+1)*2。
a[i]实际代表了倒数第i天剩下的桃子数。
数组结构算法的流程图如图3-1:程序如下:#include<stdio.h>void main(){int i,tao[10];tao[9]=1;//tao[9]代表第10天剩的桃子数for(i=8;i>=0;i--){tao[i]=2*(tao[i+1]+1);}printf("共摘了%d个桃子!\n",tao[0]); }2.链结构建立一个链表,根据每天桃子数与后一天桃子数的关系n=2*n+2,依次将每天的桃子数存进链表中,最后输出第一天的桃子数。
猴子吃桃子递归算法

递归算法案例—猴子吃桃子一、案例描述某天,一只猴子摘了一堆桃子,具体多少它没数。
猴子每天吃了其中的一半然后再多吃了一个,第二天吃剩余的一半后再多吃了一个,直到第10天,猴子发现只有一只桃子。
问这只猴子在第一天摘了多少个桃子二、算法分析这只猴子共用了10天吃桃子,只知道最后一天剩余1只桃子,要想求出第1天剩余的桃子数,就先要求出第2天剩余的桃子数,以此类推。
假设An表示第n天剩余的桃子数量,则有如下关系:A1=(A2+1) x 2A2=(A3+1) x 2A3=(A4+1) x 2….A1=(A10+1) x 2A10=1从上述的式子可知,只能通过倒推来求得第一天的桃子数三、算法实现算法代码实现如下:#include<stdio.h>/***@briefpeach*@paramn:猴子吃桃子的天数*@return*/long peach(int n){int pe;if(n==1){return1;}else{pe=(peach(n-1)+1)*2;}return pe;}int main(void){int n;//天数long peachnum;//最初桃子数printf("pleasenumberofDate");scanf("%d",&n);peachnum=peach(n);printf("Thepreviousnumberis:%1d",peachnum);return0;}程序中使用递归调用peach函数来计算第一天的桃子数量。
其中关键是前一天总比后一天多一半加1.当n=10的时候,正好求出猴子吃桃子问题。
C语言程序设计例子(3):猴子吃桃问题

C语⾔程序设计例⼦(3):猴⼦吃桃问题题⽬:猴⼦吃桃问题:猴⼦第⼀天摘下若⼲个桃⼦,当即吃了⼀半,还不瘾,⼜多吃了⼀个 第⼆天早上⼜将剩下的桃⼦吃掉⼀半,⼜多吃了⼀个。
以后每天早上都吃了前⼀天剩下 的⼀半零⼀个。
到第10天早上想再吃时,见只剩下⼀个桃⼦了。
求第⼀天共摘了多少。
思路分析:采⽤逆向思维,从后往前推断,发现其中有相同的地⽅,即出现递推公式,可以采⽤递归⽅法。
令S10=1,容易看出S9=2(S10+1),简化⼀下S9=2S10+2S8=2S9+2…..Sn=2Sn+1+2下⾯我将解决这个问题。
(第⼀种为普通循环⽅式,第⼆种为递归⽅式)⽅法⼀:while#include<stdio.h>int main(){int day,x1,x2;day=9;x2=1;while(day>0){x1=(x2+1)*2;x2=x1;day--;}printf("the total is %d\n",x1);}⽅法⼆:递归#include<stdio.h>int sumPeach(int day);int main(){int sum;sum=sumPeach(1);printf("%d",sum);}int sumPeach(int day){if(day==10){return1;}elsereturn2*sumPeach(day+1)+2;}。
VB递归算法

if 是最初两项 then 斐波纳切数=1 else 斐波纳切数=前两个斐波纳切数之和 end if
案例二、斐波那契数列问题
1、1、2、3、5、8、13、21、34、65…… 求第N个斐波纳切数 if 是最初两项 then 斐波纳切数=1 else 斐波纳切数=前两个斐波纳切数之和 end if
我们能不能这样设一个函数:
• 算法描述: • function 你有多少桃子?(第几天) • 如果 第10天,那么 • 桃子数 = 1 • 否则 • 桃子数= ( 明天的桃数+1)* 2 • end function
第n天的桃子数 2 -1 = 第n+1天的桃子数 第n天的桃子数 = (第n+1天的桃子数+1)*2
递归算法
老和尚的故事… 从前有座山, 山里有座庙, 庙里有个老和尚, 给小和尚讲故事,
从前有座山,
山里有座庙,
从前有座山,
山里有座庙,
庙里有个老和尚,
庙里有个老和尚,
给小和尚讲故事,
给小和尚讲故事,
故事是什么呢• 有一天小猴子摘若干个桃子,当即 吃了一半还觉得不过瘾,又多吃了 一个。第二天接着吃剩下桃子中 的一半,仍觉得不过瘾又多吃了 一个,以后小猴子都是吃尚存桃 子一半多一个。到第10天早上小 猴子再去吃桃子的时候,看到只 剩下一个桃子。问小猴子第一天 共摘下了多少个桃子?
Tao(1)=(tao(2)+1)*2
• 算法实现:
• Function tao(days As Integer) As Integer
调用 Tao(2)=(tao(3)+1)*2 调用 Tao(3)=(tao(4)+1)*2 调用 Tao(8)=(tao(9)+1)*2 调用 Tao(9)=(tao(10)+1)*2 调用 Tao(10)= 1
JS之递归(例题:猴子吃桃)

JS之递归(例题:猴⼦吃桃)
例题1:公园⾥有200个桃⼦,猴⼦每天吃掉⼀半以后扔掉⼀个,问6天以后还剩余多少桃⼦?
var sum = 200;
for(var i= 0;i<6;i++)
{
sum = parseInt(sum/2)-1
}
alert(sum);
例题2:公园⾥有⼀些桃⼦,猴⼦每天吃掉⼀半以后扔掉⼀个,第6天的时候发现还剩下1个桃⼦,问开始有⼏个桃⼦?var sum = 1;
for(var i = 0;i<6;i++)
{
sum = (sum+1)*2;
}
alert(sum);
使⽤函数解决例题2
function ShuLiang(n)//⽤来返回第n天的数量
{
if(n == 6)//已知第6天
{
return 1;//桃⼦数量为1
}
var sl = (ShuLiang(n+1)+1)*2;//第n天的桃⼦数量=(下⼀天的桃⼦数量+1)*2
return sl;//return第n天的数量
}
alert(ShuLiang(0));
函数功能:给⼀个天数,返回该天数的桃⼦的数量。
最主要的是下⼀天的桃⼦数量怎么求,函数实现过程是想要求第1天的桃⼦数量就需要2天桃⼦数量;
想要求第2天的桃⼦数量就需要3天桃⼦数量;
想要求第3天的桃⼦数量就需要4天桃⼦数量;
想要求第4天的桃⼦数量就需要5天桃⼦数量;
想要求第5天的桃⼦数量就需要6天桃⼦数量;
⽽第6天的桃⼦的数量已经知道了,是1。
进⽽5-4-3-2-1-0的数量的桃⼦就能⽤公⽰算出来了。
猴子吃桃子问题

L=(LinkList *)malloc(sizeof(LinkList));
while(1){
printf("\n");
printf("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\n");
int k;
scanf("%d",&k);
switch(k){
case 1:
for(i=0;i<=10;i++){
N=recursion(i);
printf("第 %d 天,还剩桃子 %d 个\n",i,N);
}
printf("桃子原来的总数为:%d",a[0]);
break;
case 3:
L=CreatList(); DisplayList(L);
printf("桃子原来的总数为:%d\n",L->data);
p->next=L;
L=p;
}
return L;
}
void DisplayList(LinkList *L){
LinkList *p;
int i=0;
p=L;
while(p!=NULL){
printf("第%d 天,还剩桃子%d 个\n",i++,p->data);