实验一:递归函数的设计与实现
更新时间:2024-05-22 12:32:01 阅读量: 综合文库 文档下载
- 设计一个递归函数推荐度:
- 相关推荐
实验一:递归函数的设计与实现
实验目的:掌握递归函数的设计与实现方法 实验原理: 递归函数的设计
实验步骤:编写程序实现教材P12例2-5 整数划分问题 问题描述:整数划分问题是将一个正整数n拆成一组数连加并等于n的形式,且这组数中的最大加数不大于n。
思路:递归函数的声明为 int split(int n, int m);其中n为要划分的正整数,m是划分中的最大加数(当m > n时,最大加数为n),
1 当n = 1或m = 1时,split的值为1,可根据上例看出,只有一个划分1 或 1 + 1 + 1 + 1 + 1 + 1
可用程序表示为if(n == 1 || m == 1) return 1; 2 下面看一看m 和 n的关系。它们有三种关系 (1) m > n
在整数划分中实际上最大加数不能大于n,因此在这种情况可以等价为split(n, n);
可用程序表示为if(m > n) return split(n, n); (2) m = n
这种情况可用递归表示为split(n, m - 1) + 1,从以上例子中可以看出,就是最大加
数为6和小于6的划分之和
用程序表示为if(m == n) return (split(n, m - 1) + 1); (3) m < n
这是最一般的情况,在划分的大多数时都是这种情况。
从上例可以看出,设m = 4,那split(6, 4)的值是最大加数小于4划分数和整数2的划分数的和。
因此,split(n, m)可表示为split(n, m - 1) + split(n - m, m) 实验要求:(1)使用C++或TC2.0
(2)上机前要有源代码或流程图。
简易代码
#include
if((n<1)||(m<1)) return 0; if((n==1)||(m==1)) return 1; if(n if(n==m) return q(n,m-1)+1; return q(n,m-1)+q(n-m,m); } int main() { int n,m; cout<<\请输入整数和最大加数:\ cin>>n>>m; cout<<\正整数\共有\种不同的划分。\} 结果显示 稍复杂 #include #include \用于system()函数*/ #include \#define NN 300 int y=0; /*用于记录存放的数据的个数*/ int length=0; /*用于存放标记-1的个数*/ int number[NN]; /*存放所有的划分出来的数以及换行符*/ /*函数q()用于计算给定整数的划分的个数*/ int q(int n,int m) { if((n<1)||(m<1))return 0; if((n==1)||(m==1))return 1; if(n /*函数slipt()用于递归划分给定的整数*/ void slipt(int n,int m) { if((n==0)||(m==0)) return; /*如果被划分的数为0,或最大加数为0,则退出slipt()函数*/ if(m==1) /*如果最大加数为1,则存储n个1*/ for(int i=n;i>0;i--) number[y++]=1; /*将n个1存放汝number数组中*/ if(n==1) number[y++]=1; if(m>n&&n>1)slipt(n,n); /*如果最大加数大于被划分的数,则递归调用slipt(n,n)*/ if(m>1&&m<=n) /*如果最大加数大于0且不大于被划分的数,则进行以下工作(分两种情况)*/ { number[y++]=m; /*将本次最大加数存入数组number中*/ slipt(n-m,m); /*保持最大加数不变,被划分的数减小m,因为此时最大加数已作为一个加数因子*/ number[y++]=-1; /*插入标志-1*/ length++; /*记录标志-1的个数*/ slipt(n,m-1); /*保持被划分的数不变,最大加数减1,此时最大加数变为m-1*/ } } //number2为存放数据的数组,n为待划分的整数,length为-1的个数,sum为存入number2中的数据的个数 void out_of_slipt(int * number2,int n,int length,int sum) { int * c=(int *)malloc(sizeof(int)*(length+2)); /*动态申请一块内存空间作为存放两个相邻标志间的数的和*/ if (NULL==c){printf(\ /*判断申请是否成功*/ for(int i=0;i //为被划分的数的数 for (int i6=0;i6 // for(mnm=0;mnm<=jx;mnm++) // printf(\ printf(\ for(mnm=0;b[k2][mnm]!=0;mnm++) printf(\ printf(\ } else { summ-=b[i6+mx][jx]; } } } } } } i6=k2; //恢复本次下标 } free(c); for(int ff=0;ff int main() { for (int r=0;r printf(\有%d种划分!\\n\ printf(\种划分如下(每一行代表一个划分):\\n\ slipt(integer,m); number[y]=-1; //存入最后一个标志-1 length+=1; out_of_slipt(number,integer,length,y); for(int k=0;k 结果显示
正在阅读:
实验一:递归函数的设计与实现05-22
秘书心理学复习题09-14
锅炉安装监理实施细则 - 图文10-08
月工作总结模板下载范文08-03
柳叶湖总体规划文本01-09
重阳节慰问活动方案5篇202005-24
武汉纺织大学专业武汉纺织大学招生网站-武汉纺织大学分数线02-01
2019年内蒙古通辽市中考数学试卷03-11
县十六届一次人代会政府工作报告1月10日05-04
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 递归
- 函数
- 实验
- 实现
- 设计
- 医务人员职业安全管理制度
- 《Java编程语言:原理与范例》课后实验源代码
- 高中地理第一单元环境与环境问题1.1人类环境教案鲁教版选修62
- 普通物理实验题
- 风电场化学监督管理标准
- 2015中考诗歌鉴赏真题
- 电影产业分析报告-暨微电影发展影响分析
- 2019年新教师培训的心得体会
- 某某检验检测机构全套文件合集(含手册) 2018年原创经典RBT214
- 姜占易六爻法门卦例精解
- 只含有碳氢两种元素的化合物
- 部编人教版版二年级语文上册期末专项归类复习试题及答案
- 伊利实业集团股份有限公司财务报表分析000
- 2017咨询工程师继续教育PPP政策解析及制度建设试卷
- 技术在森林资源监测中的特点及发展趋势
- 不合格品控制程序QPQC-02
- 使用qemu进行内核源码级调试
- 苏教版二年级语文补充习题答案(下学期)
- UML在线音乐系统
- 2015年北京师范大学博士生英语入学考试试题