数据结构猴子吃桃课程设计.docx

上传人:b****7 文档编号:9664240 上传时间:2023-02-05 格式:DOCX 页数:12 大小:162.65KB
下载 相关 举报
数据结构猴子吃桃课程设计.docx_第1页
第1页 / 共12页
数据结构猴子吃桃课程设计.docx_第2页
第2页 / 共12页
数据结构猴子吃桃课程设计.docx_第3页
第3页 / 共12页
数据结构猴子吃桃课程设计.docx_第4页
第4页 / 共12页
数据结构猴子吃桃课程设计.docx_第5页
第5页 / 共12页
点击查看更多>>
下载资源
资源描述

数据结构猴子吃桃课程设计.docx

《数据结构猴子吃桃课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构猴子吃桃课程设计.docx(12页珍藏版)》请在冰豆网上搜索。

数据结构猴子吃桃课程设计.docx

数据结构猴子吃桃课程设计

课程设计报告书

课程名称:

数据结构与算法

题目:

猴子吃桃子问题

学生姓名:

专业:

计算机科学与技术

班别:

学号:

指导老师:

日期:

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语言是很容易实现的,只要能理解题目的意思,基本上就能写出数学公式了,也意味着第一步就完成了。

接下来就是写代码了,不过代码涉及的内容有点多,需要懂得如何运用数组,创建单链表,理解递归算法的运算过程,因此,在课程设计之前,需要看一下书本相关的内容。

虽然课程设计是弄出来了,不过递归算法我还是有点不太理解,需要日后加强理解和学习。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 党团工作 > 入党转正申请

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1