利用递归解决实际问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构上机实验报告题目:用递归方法解决问题
学生姓名
学生学号
学院名称计算机学院
专业计算机科学与技术
时间
目录
第一章需求分析 (1)
1.1 原题表述 (1)
1.2 问题解决方案 (1)
第二章概要设计 (2)
2.1 主要算法描述 (2)
2.2 主要算法分析 (2)
第三章详细设计 (3)
3.1 程序代码 (3)
第四章调试分析 (4)
4.1 出现的问题及解决方法 (4)
第五章测试分析 (5)
5.1 测试样例 (5)
第一章需求分析
1.1 原题表述
日本著名数学游戏专家中村义作教授提出这样一个问题:父亲将2520个桔子分给六个儿子。分完后父亲说:“老大将分给你的桔子的1/8给老二;老二拿到后连同原先的桔子分1/7给老三;老三拿到后连同原先的桔子分1/6给老四;老四拿到后连同原先的桔子分1/5给老五;老五拿到后连同原先的桔子分1/4给老六;老六拿到后连同原先的桔子分1/3给老大”。结果大家手中的桔子正好一样多。问六兄弟原来手中各有多少桔子?请设计递归算法解决该问题。
1.2 问题解决方案
由于最后每个人分得的橘子一样多,所以最后每个人手里的橘子有2520/6 = 420个。因为每个人在拿到上一个人给的以后又分了一部分给下一个(老大不同,老大是最后得到的。根据题目关系,可以算出老大开始有橘子240个。)根据每个人得到与给出橘子的关系,可以用递归算法解决问题。
2.1 主要算法描述
解决此问题主要使用递归运算。
由题目可以看出原来手中的加上得到的满足关系式:
StartNum = 420 * (n -2)/(n - 1)
分给下一个人的橘子数:
GiveNum = AfterGetNum / n;
下一个人的橘子数:
nextStartNum = 420*(n-1)/(n-2) - GiveNum;
下一个人加上之前得到的橘子的总数:
afterGetNum = nextStartNum + GiveNum;
以此使用递归算法可以算出各个孩子原来手中的橘子数。
2.2 主要算法分析
此递归算法的时间复杂度为O(n)
3.1 程序代码
#include
#include
using namespace std;
//i表示第i个儿子,StartNum表示原有橘子数,AfterGetNum表示原有的加上得到的橘子数,
int OrangeNum(int i, int StartNum, int AfterGetNum, int n)
{
if(i > 6)return 0;
string s[7] = {" ","老大","老二","老三","老四","老五","老六"};
cout << s[i] << "原有的橘子数为:" << StartNum << endl;
int GiveNum = AfterGetNum / n; //分给下一个人的橘子数
int nextStartNum = 420*(n-1)/(n-2) - GiveNum; //下一个人的橘子数
int afterGetNum = nextStartNum + GiveNum; //下一个人加上之前得到的橘子的总数 OrangeNum(i+1, nextStartNum, afterGetNum, n-1);
}
int main()
{
//根据题目可以计算出老大原有橘子240个
OrangeNum(1,240,240,8);
return 0;
}
第四章调试分析
4.1 出现的问题及解决方法
1、一开始搞错了每个人给出与得到的关系,试运行结果错误。重新考虑,得到正确关系,改正后运行正确。
第五章测试结果5.1 测试样例