基于C++的递推法完成经典型算法应用

1. 课程设计目的

《软件设计基础-C++》课程设计是这门课程的实践性教学环节之一,本次设计结合实际应用的要求,使课程设计既覆盖C++的知识点,又接近工程实际需要。目的是通过课程设计的综合训练,培养学生实际分析问题、解决问题的能力,以及编程和动手能力,最终目标是通过课程设计这种形式,帮助学生系统掌握C++这门课程的主要内容,养成良好的编程习惯,更好的完成教学任务。

2. 课程设计任务与要求

要求:

本次课程设计利用《软件设计基础-C++》课程中所学到的编程知识和编程技巧,完成具有一定难度和工作量的程序设计题目,帮助学生掌握编程、调试的基本技能,独立完成所布置的任务。

要求:

  • 对系统进行功能需求分析
  • 设计合理的数据结构和系统框架
  • 界面设计美观、清楚、合理
  • 编程简练,程序功能齐全,能正确运行
  • 具有一定的创新性
  • 说明书、流程图要清楚
  • 课题完成后必须按要求提交课程设计报告

任务:

  • 解决著名的约瑟夫问题:
  • 解决五渔夫分鱼问题
  • 解决猴子吃桃子问题

3. 课程设计说明书

⑴功能描述

  • 约瑟夫问题: N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。
    例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉,最终胜利者是C
  • A,B,C,D,E五个渔夫夜间合伙捕鱼,,第二天清A先醒来,他把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,B醒来后,也把鱼均分五份,把多余的一条扔回湖中,便拿了自己的一份回家了,C,D,E也按同样方法分鱼。问5人至少捕到多少条鱼?
  • 猴子吃桃子问题一只小猴子一天摘了许多桃子,第一天吃了一半,然后忍不住又吃了一个;第二天又吃了一半,再加上一个;后面每天都是这样吃。到第10天的时候,小猴子发现只有一个桃子了。问小猴子第一天共摘了多少个桃子。

⑵概要设计

模块结构图:

本次课设分为3个模块。分别是约瑟夫问题的求解、五渔夫吃鱼问题的求解、猴子吃桃问题的求解,使用模块结构图可以如下来表示:

在这里插入图片描述

⑶详细设计

扫描二维码关注公众号,回复: 14248645 查看本文章

总体流程图:

⑷代码实现

本系统总共3个子问题,详细如下:

求解约瑟夫问题

作用:根据用户输入的约瑟夫问题,进行求解。
设计思路:首先判断用户输入的数据是否合理,在合理的情况下。使用Joseph(,m,k)表示第M个人报数,每报到K时出圈,其中核心递归两层之间的公式为Joseph(m, k)=(Joseph(m-1,k)+k)%m:

代码如下:

int Joseph(int m,int k)
{
    if(m<=0||k<=0)
    {
        cout<<"error!"<<endl;
        return -1;
    }else
    {
        if(m==1)
        {
            return 0;
        }else
        {
            return ((Joseph(m-1,k)+k)%m);
        }
    }
}
void slove_Joseph(){
	int m,k;
	cout<<"请输入总人数和淘汰数字:"<<endl;
	cin>>m>>k;
	cout<<"胜利者为:"<<Joseph(m,k) + 1<<endl; 
}

求解五渔夫分鱼问题

作用:求解五渔夫分鱼问题。

设计思路:使用递归技术解决,递归的终止条件是1,然后不断的向上递推,递推规则是fish(i)=fish(i-1)*5+1;最终解决了该问题。

代码如下:

int fish(int i){
	if(i == 0) 	
		return  1;
	else{
		i--;
		return 5*fish(i) + 1;
	}
}

求解猴子吃桃问题

作用:求解猴子吃桃问题

设计思路:使用递归技术解决,递归的终止条件是1,其他天吃的桃子都是昨天吃的桃子的数目+1的2倍.

代码如下:

int monkey(int i){
	if(i == 1) 	
		return  1;
	else{
		i--;
		return 2*(monkey(i)+1);
	}
}

4. 课程设计成果

运行结果

在运行的过程中,我们依次选择问题列表中的问题。然后进行进行求解。

5. 程序调试过程

在程序调试的过程中,我先逐步调试每一个小问题,对于约瑟夫问题,通过添加断点,我才发现深入的找出了问题的所在。调试完三个小问题之后,最终我将程序结合起来,最终程序完美的运行。

6. 设计问题的不足和改进方案

设计问题的不足:

递推有一个不足,当递推层数大于1000时,就是容易发生栈的溢出,而且效率比较低,可能会有重复计算的现象。

改进方案

针对递归情况过深的问题,可使用一个数组,来存储中间的计算结果,也就是动态规划算法,可解决栈溢出和重复计算的问题。

7. 课程设计心得

经过这次课设,进一步加深了我对递推的理解,递推实际上是一个很难的东西,经过在这次课设中的三道递推题目,也许3道题目和很少,但是当我深深的吃透了这三道题,我便对递推有了新的见解。当然在这次实验中,我也犯了不少的错误,但是在写程序中,犯错也是一种成功。最后,这次课程设计让我对递推有了更深的理解。

8. 参考文献

  • 啊哈磊.啊哈!算法.北京:人民邮电出版社社,2014
  • 啊哈磊 李嘉浩.算法神探.北京:电子工业出版社,2017.2
  • 秋叶拓哉 岩田阳一 北川宜稔.挑战程序设计竞赛(第2版).北京:人民邮电出版社,2013.7
  • [[美]Jesse Liberty](https://book.douban.com/search/Jesse Liberty)/[[美] Siddhartha Rao](https://book.douban.com/search/Siddhartha Rao)/[[美] Bradley Jones](https://book.douban.com/search/Bradley Jones).21天学通C++.北京:人民邮电出版社,2009.8
    iddhartha Rao](https://book.douban.com/search/Siddhartha Rao)/[[美] Bradley Jones](https://book.douban.com/search/Bradley Jones).21天学通C++.北京:人民邮电出版社,2009.8
  • 张德富.算法设计与分析.北京:国防工业出版社,2009.1

猜你喜欢

转载自blog.csdn.net/newlw/article/details/125190412
今日推荐