数据结构猴子吃桃课程设计.docx
《数据结构猴子吃桃课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构猴子吃桃课程设计.docx(12页珍藏版)》请在冰豆网上搜索。
![数据结构猴子吃桃课程设计.docx](https://file1.bdocx.com/fileroot1/2023-2/5/a292e19b-4aef-4e66-99d3-cfe76453fe30/a292e19b-4aef-4e66-99d3-cfe76453fe301.gif)
数据结构猴子吃桃课程设计
课程设计报告书
课程名称:
数据结构与算法
题目:
猴子吃桃子问题
学生姓名:
专业:
计算机科学与技术
班别:
学号:
指导老师:
日期:
2012年12月日
目录
一、问题描述2
二、基本要求2
三、工具和准备工作
2
1.工具2
2.准备工作2
2.1分析题目2
四、分析与实现3
4.1数组实现3
4.2链结构实现4
4.3递归结构实现6
五、测试与结论8
5.1数组结构算法实现8
5.2链式结构算法实现8
5.3递归算法实现9
六、总结10
一、问题描述
有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。
用多种方法实现求出原来这群猴子共摘了多少个桃子。
二、基本要求
1)采用数组数据结构实现上述求解
2)采用链式数据结构实现上述求解
3)采用递归实现上述求解
三、工具和准备工作
1.工具
一台电脑、运行平台是WindonsXP、VisualC++6.0
2.准备工作
2.1分析题目
猴子每天吃当前桃子的一半加多一个,所以可以设它们总共所摘的桃子有m个。
因此用数学的方法可以求出总共的桃子有多少。
即:
m=2m
+2
+1(n=1,2,3,…,9),其中,猴子在前9天里每天所吃的桃子数为:
m
+2
,在前9天里每天所剩下的桃子数为:
m
+
(n=1,2,3,…,9)。
其实也可以这样想:
设猴子总摘了m个桃子。
它们第一天吃了
个,第二天吃了
个,第三天吃了
个,…,第九天吃了
个,所以这不难看出第一天吃的桃子是第二天的2倍。
因此,令猴子前天吃了
个,后天吃了
,由题意得:
=
+1,化简得:
=
以此为依据实现数组、链式和递归求解。
四、分析与实现
4.1数组实现
用数组方法实现,先定义一个一维数组,然后用for循环,按照天数的倒序,就可以求解出来了。
用数组求解的流程图如下:
用数组实现的代码如下:
#include
voidshuzu()
{
printf(“*****数组结构算法实现*****\n”);
}
voidmain()
{
shuzu();
intday[11],i;//定义一个整形数组和变量;
day[10]=1;//day[10]赋值为1
for(i=10;i>0;i--)//用for循环实现让天数倒序
{
day[i-1]=2*(day[i]+1);//给数组赋值
printf(“第%d天剩下的桃子数:
%d\n”,i,day[i]);//输出每天剩下的桃子数
}
printf(“猴子们总共所摘的桃子数为:
%d\n”,day[0]);//输出桃子总数day[0]
}
4.2链结构实现
用链式数据结构实现,首先定义一个空链表S,产生一个头结点,并将该头结点赋给空链表的地址S;然后把每天的桃子数从链表的第一个结点插入链表S;最后第一天的桃子数被最后一个插入到链表S中,成为链表中的第一个值,并将其赋给t,输出t即是第一天剩下的桃子数。
核心代码:
创建单链表:
structlist
{
inttaozi;//定义一个数据域
structlist*next;//创建链表指针
};
typedefstructlistnode;
node*head;
voidlianshi()//创建链表
{
inti=10;
node*S,*p;
head=(node*)malloc(sizeof(node));//定义头指针
p=head;
intk=1;
for(;i>0;i--)
{
S=(node*)malloc(sizeof(node));//给链表申请一个空间
S->taozi=k;
k=2*(k+1);//计算前一天是后一天加1的2倍
p->next=S;
p=S;
}
p->next=NULL;
p=head;
head=head->next;
free(p);//释放p针
}
计算每天剩下的桃子数和猴子们所摘桃子的总数:
voidshuchu()
{
node*q;
inti=10,sum=0,j;
q=head;
while(q&&i>0)
{
printf("第%d天剩下的桃子数:
%d\n",i,q->taozi);
j=q->taozi;
q=q->next;
i--;
}
sum=(2*(j+1));//计算猴子们总共所摘桃子的总数
printf("猴子们所摘桃子的总数:
%d\n",sum);
}
4.3递归结构实现
用递归算法实现,就是利用
=
,定义一个sum函数,然后不断调用自身,最后递归回到函数sum,这样就求得第一天剩下的桃子数了。
用递归算法实现的流程图如下:
用递归实现的源代码:
#include
voiddigui()
{
printf(“*****递归算法实现*****\n”);
}
intsum(intday)//定义sum函数
{
if(day==10)
return1;
else
return(sum(day+1)+1)*2;//递归,让变量day每次加1后再乘以2
}
voidmain()
{
digui();
inti,j,taozi;//变量声明
for(i=1;i<=10;i++)
{
taozi=sum(i);
printf("第%d天剩下的桃子数:
%d\n",i,taozi);
}
j=sum
(1);
printf("猴子们所摘的桃子总数:
%d\n",(j+1)*2);
//第一天剩下的桃子数加1,后再乘以2就是所摘的桃子总数
}
五、测试与结论
5.1数组结构算法实现
数组结构算法的代码运行的结果:
用数组这种算法实现比较简单,只要定义一个数组,把每天剩下的桃子数作为数组的元素,利用
=
这个等式可求出每天剩下的桃子数和所摘的桃子总数。
如上图所示猴子们所摘桃子总数为3070个。
5.2链式结构算法实现
用链式结构算法的源代码运行的结果:
用链式结构算法来求解是比较复杂的,它要涉及单链表的创建和指针的移动。
如上图所示猴子们所摘的桃子总数为3070个。
5.3递归算法实现
用递归算法实现的源代码的运行结果:
用递归算法来求解也是比较简单的,就是首先定义一个sum函数,再利用
=
这个等式,然后让其不断调用自身,最后递归,这样就求得了每天剩下桃子的个和猴子们所摘桃子的总数。
如上图所示所摘桃子的总数为3070个。
六、总结
猴子吃桃子这个问题,如果用数学公式来求的话会比较复杂,而且运算量也比较大。
不过,拿到题目时,不必着急去想用代码怎么运算,而是要先分析题目,找出问题核心所在,然后想出数学公式来求解,最后把所得到的数学公式变为代码,这样做会比直接想代码容易。
用一种方法求解出后,偿试用多种方法来求解,这样有助于思维的发散。
如果想不到其它的方法,也可以参照别人的,再结合自己所想的,最后再得到属于自己的求解方法;也可以向同学们求助,因为其他同学想的与自己的会有所不同的,他们的想法可能会为你打开另一种思路,让你少走弯路。
猴子吃桃的问题用C语言是很容易实现的,只要能理解题目的意思,基本上就能写出数学公式了,也意味着第一步就完成了。
接下来就是写代码了,不过代码涉及的内容有点多,需要懂得如何运用数组,创建单链表,理解递归算法的运算过程,因此,在课程设计之前,需要看一下书本相关的内容。
虽然课程设计是弄出来了,不过递归算法我还是有点不太理解,需要日后加强理解和学习。