基于数据结构算法解决猴子吃桃问题

摘  要

当下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;
}

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X-MTing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值