猴子吃桃子问题
有一群猴子摘了一堆桃子,他们每天都吃当前桃子的一半且再多吃一个,到了第10天就只余下一个桃子。用多种方法实现求出原来这群猴子共摘了多少个桃子。要求:
1)采用数组数据结构实现上述求解
2)采用链数据结构实现上述求解
3)采用递归实现上述求解
二、实验目的
采用数组,链等数据结构实现问题的求解,练习数组,链,递归等方法求解问题
求出原来这群猴子共摘了多少个桃子
四、实验步骤
基本设计思路:
(1)数组:定义一个一维数组,分别存储每天的桃子个数,根据题目的内容找出各个数之间的关系,用数组元素表示出来,计算出第一天总共的桃子个数。
(2)链:创建一个链表,将每一天剩余的桃子数储存到链表中最后依次输出链表所储存的元素。
(3)递归:定义一个递归函数,当递归函数中为1时递归函数返回桃子总数,否则桃子数变为题目中所给的关系。
算法设计:
(1)数组:定义一个一维数组peach[10],分别存储每天的桃子个数,peach[9]为第十天的桃子数,个数为1。根据题目的内容找出各个数之间的关系:peach=(1+peach)*2;进行循环直到天数day变为1,输出第一天的桃子总数。
(2)链:peach为桃子个数,day为天数。创建一个链表head为头结点,采用尾插法将桃子个数插入到链表中,依次输出链表所储存的元素。
(3)定义一个递归函数f(),peach为桃子个数,day为天数。当递归函数中为1时递归函数返回桃子总数,否则桃子数变为题目中所给的关系即:peach=(1+peach)*2;
函数相关说明:
(1)数组:int main()//实现函数运算与输出;
(2)链:int main()//实现对其他函数的调用与输出;
void Insert()//实现链表的建立
(3)递归:int main()//实现对其他函数的调用与输出;
int f(int day,int peach)//实现递归调用
输入与输出:
无输入
输出总桃子个数
程序运行结果
五、源程序清单(代码)
(1)数组
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{int peach[10];//定义一个一维数组,分别存储每天的桃子个数peach[9]=1;//第十天桃子数量为1int i;printf("--------数组方法--------\n\n第10天还剩:1个桃子\n");for(i=8;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;
}
(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;
}
(3)递归#include <iostream>
#include<stdio.h>
using namespace std;int f(int day,int peach)
{if(day==1){printf("第%d天还剩:%d个桃子\n\n",day,peach);return peach;}else{printf("第%d天还剩:%d个桃子\n",day,peach);peach=(1+peach)*2;return f(day-1,peach);}
}
int main()
{int peach=1;int day=10;int sum=0;printf("--------递归方法--------\n\n");sum=f(day,peach);printf("猴子共摘了%d个桃子\n",sum);return 0;
}














