摘 要
当下C++语言是一门重要的课程学习,学会运用并结合其他的知识一起解题是一件值得我们重视的,数据结构是一门结合 C+知识的重要课程,因此我们要学会将平时课本的知识运用到我们现实生活当中,这样才能让我们所学的知识更加深刻。猴子吃桃的问题就是一个例子,我们可以运用简单的三种解法进行解题,即数组求值解法,链表求值解法和递归求值解法,通过分析三种解法,根据各种解法的功能从而我们得到最合适的求法。
关键词:猴子吃桃 数组法 链表法 递归法 分析
第一章 绪 论
1.1 课设主要研究问题
猴子吃桃子问题
有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。要求:
1)采用数组数据结构实现上述求解
2)采用链数据结构实现上述求解
3)采用递归实现上述求解
1.2 课设应用的理论知识
1.2.1 题目分析
猴子每天吃当前桃子的一半加多一个,所以可以设它们总共所摘的桃子有m个。因此用数学的方法可以求出总共的桃子有多少。
设第九天剩下n个,应该吃掉 (n/2)+1 则 n-(n/2)-1=1 得 n=4 第九天剩下4个;同理设第8天剩下n个,应该吃掉 (n/2)+1 则 n-(n/2)-1=4,解得 n=10 第八天剩下10个 以此类推 第七天剩下 (10+1)x2=22个,第六天剩下 (22+1)x2=46个,第五天剩下(46+1)x2=94个,第四天剩下 (94+1)x2=190个,第三天剩下(190+1)x2=382,第2天剩下(382+1)x2=766,第一天有 (766+1)x2=1534个桃子。
其实也可以这样想:设猴子总摘了m个桃子。它们第一天吃了 个,第二天吃了 个,第三天吃了 个,…,第九天吃了 n=9个,所以这不难看出第一天吃的桃子是第二天的倍。不妨设f(n)是第n天所剩桃子总数,因此有2[f(n+1)+1]=f(n),n=1,2,。
第二章 课设实现过程
2.1 数组实现
用数组方法实现,先定义一个一维数组,然后用for循环,按照天数的倒序,就可以求解出来了。用数组求解的流程图如下:
利用数组实现代码如下:
#include
void shuzu()
{
printf(“*****数组结构算法实现*****\n”);
void main()
{
shuzu();
int day[11],i;//定义一个整形数组和变量;
day[10]=1;//day[10]赋值为1
for(i=10;i>0;i--)//用for循环实现让天数倒序
{
day[i-l]=2*(day[i]+1);//给数组赋值
printf(“第%d天剩下的桃子数:%d\n”,i,day[i]);//输出每天剩下的桃子数
}
printf(“猴子们总共所摘的桃子数为:%d\n”, day[0]);,//输出桃子总数
}
2.2 链结构实现
用链式数据结构实现,首先定义一个空链表S,产生一个头结点,并将该头结点赋给空链表的地址S;然后把每天的桃子数从链表的第一个结点插入链表S;最后第一天的桃子数被最后一个插入到链表S中,成为链表中的第一个值,并将其赋给t,输出t 即是第一天剩下的桃子数。
核心代码:创建单链表:
struct list
{
Int taozi; 定义一个数据域
struct list*next;创建链表指针
} ;
typedef struct list node;
node*head;
void lianshi() 创建链表
{
int i=10;
node* S,*p;
head=(node*) malloc(sizeof(node));定义头指针p=head;
int k=1;
for(;i>0;i--)
{ 给表申请一个空间
S->taoz 1=K;
k=2*(k+1) ; 计算前一天是后一天加1的2倍
p=>next=S;
p=S;
}
p=head;
head=head->next;
free(p);//释放p针
}
计算每天剩下的桃子数和猴子们所摘桃子的总数:
void shuchu()
{
node *q;
int i=10, sum=0,j;
q=head;
while(q&&i>0)
{
printf("第%d天剩下的桃子数
j=q->taοzi;
;
i--;
}
)计算猴子们总共所摘桃子的总数
printf("猴子们所摘桃子的总数:%d\n", sum);
}
2.3 递归结构实现
用递归算法实现,就是利用 x1=2(x2+1),定义一个sum函数,然后不断调用自身,最后递归回到函数sum,这样就求得第一天剩下的桃子数了。
用递归算法实现的流程图如下:
用递归实现的源代码:
#include<stdio.h>
void digui()
{
printf(“******递归算法实现*****\n”);
}
int sum(int day)//定义sum函数
{
if(day==10)
return 1;
else
return(sum(day+1)+1)*2;//递归,让变量day每次加1后再乘以2
}
void main()
digui();
Int i,j,taozi;//变量声明
taozi=sum(i);
printf("第%d天剩下的桃子数:%d'n",i,taozi);
}
j=sum(1);
printf("猴子们所摘的桃子总数:
/第一天剩下的桃子数加1,后再乘以2就是所摘的桃子总数}
最终代码
#include<stdio.h>
int tao(int n)
{
if(n==10) return 1;
return 2*(tao(n+1)+1);
}
void main()
{
int i,j,sum;
for(i=1;i<=10;i++)
{
sum=tao(i);
printf("共摘了%d个桃子\n",sum);
}
j=tao(1);
printf("猴子们所摘的桃子总数:%d\n",(j+1)*2);
}
#include <iostream>
#include<stdio.h>
#include<malloc.h>
using namespace std;
typedef struct Node
{
int data;
struct Node *next;
} SqList;
SqList *head;
void Insert()
{
SqList *s,*p;
int day=10;
int peach=1;
head=(SqList *)malloc(sizeof(SqList));
p=head;
while(day>0)
{
s=(SqList *)malloc(sizeof(SqList));
s->data=peach;
p->next=s;
p=s;
peach=(peach+1)*2;
day--;
}
p->next=NULL;
p=head;
head=head->next;
free(p);
}
int main()
{
Insert();
SqList *p;
p=head;
int day=10,sum;
printf("--------链方法--------\n\n");
while(p!=NULL&&day>0)
{
printf("第%d天还剩:%d个桃子\n",day,p->data);
p=p->next;
day--;
if(day==1)
sum=p->data;
}
printf("\n猴子共摘了%d个桃子",sum);
return 0;
}
#include<stdio.h>
#include<iostream>
#define DAY 10//天数
using namespace std;
int main()
{
int peach[DAY];//存储数组
peach[DAY-1]=1;//最后一天桃子数
for(int i=DAY-2;i>=0;i--)
{peach[i]=(peach[i+1]+1)*2;
printf("第%d天还剩:%d个桃子\n",i+1,peach[i]);
}
printf("\n猴子共摘了%d个桃子\n",peach[0]);
return 0;
}