基于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个模块。分别是约瑟夫问题的求解、五渔夫吃鱼问题的求解、猴子吃桃问题的求解,使用模块结构图可以如下来表示:

⑶详细设计

总体流程图:

⑷代码实现

本系统总共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. 参考文献

相关推荐
学逆向的3 小时前
扩展PE头属性说明
开发语言·网络安全·pe
水饺编程3 小时前
第5章,[Win32 章节] :圆角矩形教学插图绘制程序
c语言·c++·windows·visual studio
秋名RG3 小时前
Java 基础语法
java·开发语言
码行山野赴时序归途3 小时前
C 语言文件操作完全指南:从打开到关闭
c语言·开发语言
张欣-男3 小时前
3分钟理解线性代数
线性代数·算法
Existence_Time3 小时前
CSP 考前复习
c++
白狐_7983 小时前
408 数据结构|外部排序优化:怎么减少时间开销
数据结构·算法
小白说大模型3 小时前
Hermes 全配置指南:从裸版到 AI Agent 天花板
大数据·人工智能·学习·算法·机器学习·数据挖掘
2501_937860943 小时前
Java 文件操作与IO(下):字节流、字符流实战IO读写
java·开发语言·python
zerwave4 小时前
从零实现简化 DDS 完整技术文档(含模块作用与详细注释)
linux·c++·机器人