递归实验报告文档格式.docx
- 文档编号:20843538
- 上传时间:2023-01-26
- 格式:DOCX
- 页数:13
- 大小:19.03KB
递归实验报告文档格式.docx
《递归实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《递归实验报告文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
charch[MaxSize];
//存放串字符
intlen;
//串长
}SqString;
voidSetString(SqString&
s)//设置源码
{
inti;
printf("
请输入原字符串:
"
);
scanf("
%s"
s.ch);
for(i=0;
s.ch[i]!
='
\0'
;
i++);
//计算串的长度
s.len=i;
}
voidTranString(SqStrings,SqString&
t)//开始加密
i {
if(s.ch[i]>
a'
&
s.ch[i] t.ch[i]='
+(s.ch[i]-'
+3)%26;
//将每一个字母按字母表顺序向后移3位
else
t.ch[i]=s.ch[i];
//如果字符不是字母a~z,则原样保留
t.len=s.len;
voidRecoverString(SqStrings,SqString&
t)//开始解密
d'
s.ch[i] t.ch[i]=s.ch[i]-3;
elseif(s.ch[i]>
s.ch[i] t.ch[i]=s.ch[i]+23;
//如果字符不是字母a~z,则原样保留}
voidDispString(SqStrings)//输出字符串
inti=0;
while(i {
%c"
s.ch[i]);
//字母的逐个输出
i++;
\n"
}
intmain()
SqStrings1,s2,s3;
//s1是源码,s2是加密后密码,s3是解密后密码
SetString(s1);
//输入字符串
DispString(s1);
//输出字符串
TranString(s1,s2);
//加密
DispString(s2);
//加密后输出字符串
RecoverString(s2,s3);
//解密
DispString(s3);
//解密后输出字符串
return0;
按实验要求首先定义顺序串,实验的难点在于密码的加密
和解密的实现,特别是再解密时,字母的溢出问题,在参考网上程序后很好地解决了这个问题。
在字符串的输入时,%s和%c的用法混淆,导致实验一度无法进行。
实验编完后,又发现一个如果输入的是非字母的字符,程序就无法运行,因此添加了非字母字符维持原样的代码,使得程序更加完整。
2、求解n皇后问题
编写一个程序,求解皇后问题:
在n×
n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同对角线。
要求:
使用递归算法求解;
皇后的个数n由用户输入,其值不能超过20。
程序:
constintN=20;
//最多皇后个数
intcount=0;
//记录解个数
intq[N];
//存放皇后各皇后所在的行号
voidprint(intn){//输出一个解
count++;
第%d个解"
count);
for(i=1;
i printf("
%d"
q[i]);
intfind(inti,intk){//测试第k列的i行上能否摆放皇后
intj;
j=1;
while(j if((q[j]==i)||(abs(q[j]-i)==abs(j-k)))//第j列皇后是否在i行上,位置q(x[j],j)与i,k是否同对角线
j++;
return1;
voidplace(intk,intn){//第k个皇后放到第k列上
if(k>
n)//所有皇后放置结束
print(n);
for(inti=1;
i if(find(i,k)){
q[k]=i;
intmain(void){
intn;
皇后个数:
%d"
&
n);
place(1,n);
本实验,我参考书本上串的基本运算算法并加以修改,添加主程序,调用函数实现的。
通过观察和思考书本上的三个程序的作用,发现可以通过调用place(k,n)来实现find(i,k)和print(n)以及本身的调用,所以程序的切入点在place(k,n),即需要编写一个主程序调用place(k,n)。
四、实验心得与小结
通过本次实验让我对串有了进一步的认识,熟悉串的定义和串的基本操作。
加深对串数据结构的理解。
熟悉递归的定义和递归的算法设计。
加深对递归算法的理解,逐步培养解决实际问题的编程能力。
五、指导教师评议
成绩评定:
指导教师签名:
篇二:
递归程序的设计实验报告
班级信工082学号XX06030202姓名李霄实验组别实验日期XX-12-20室温报告日期XX-12-20成绩报告内容:
(目的和要求,原理,步骤,数据,计算,小结等)
实验名称:
实验四递归程序的设计
实验目的:
1、理解递归程序的设计的基本方法。
2、根据整数乘法运算的特点,给出整数乘法运算的递归实现。
实验内容:
编写一个递归实现乘法运算的函数,并进行测试,验证设计的正确性。
实验学时:
2学时
知识点介绍
1、递归算法和课程前面讲的内容不同,递归算法不是一种数据结构,而是一种有效的算法设计方法。
递归算法是解决很多复杂问题的有效方法!
2、在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。
若调用自身,称之为直接递归。
若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。
3、如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。
方案介绍
由于x*y=x+x*(y-1)
故函数表达式为chengfa(x,y)=x+chengfa(x,y-1)
递归的出口参数为y=1
算法流程
#include"
stdio.h"
conio.h"
longchengfa(intx,inty,inta)
intz;
a=x*y;
if(y=1)printf("
a);
if(y>
1)
{a=x+chengfa(x,y-1,a);
main()
intx,y,z,a;
qingyicishurubeichenghechengwu:
%d%d"
x,&
y);
chengjiwei:
chengfa(x,y,a);
实验步骤
1、WIN-TC开发环境安装与配置
1)首先在网上下载WIN-TC的版本;
2)下载完成后进行安装,安装路径默认就可以了,一路next就ok了;
3)打开WIN-TC会出现如下界面;
2、在WIN-TC中输程序,源代码见算法流程。
3、在运行中点编译连接。
4、运行后显示编译成功即没有错误,如图:
5、点确定后再在运行中点编译连接并运行,并出现如下窗口:
6、点击确定后出现如下窗口:
7、按图示依次输入被乘数和乘数:
8、按回车显示如图:
9、按图示重新依次输入被乘数和乘数:
10、按回车显示如图:
篇三:
递归与分治实验报告
递归与分治实验报告
班级:
计科1102姓名:
赵春晓学号:
XX310XX31
实验目的:
进一步掌握递归与分治算法的设计思想,通过实际问题来应用递归与分治设计算法。
实际问题:
1集合划分问题,2输油管道问题,3邮局选址问题,4整数因子分解问题,5众数问题。
问题1:
集合划分
算法思想:
对于n个元素的集合,可以划分为由m个子集构成的集合,例如{{1,2}{3,4}}就是由2个子集构成的非空子集。
假设f(n,m)表示将n个元素划分成由m个子集构成的集合的个数。
那么1)若m==1,则f(n,m)=1;
2)若n==m,则f(n,m)=1;
3)若不是上面两种情况则有下面两种情况构成:
3.1)向n-1个元素划分成的m个集合里面添加一个新的元素,则有m*f(n-1,m)种方法;
3.2)向n-1个元素划分成的m-1个集合里添加一个由一个元素形成的独立的集合,则有f(n-1,m-1)种方法。
实验代码:
usingnamespacestd;
intjihehuafen(intn,intm)
if(m==1||n==m)
return1;
returnjihehuafen(n-1,m-1)+m*jihehuafen(n-1,m);
}
ifstreamfin("
C:
/input.txt"
);
ofstreamfout("
/output.txt"
intN,M,num;
fin>
>
N>
M;
num=jihehuafen(N,M);
fout return0;
问题2:
输油管道
由于主管道由东向西铺设。
故主管道的铺设位置只和各油井的y坐标有关。
要使主管道的y坐标最小,主管道的位置y坐标应是各个油井y坐标的中位数。
先用快速排序法把各个油井的y坐标排序,然后取其中位数再计算各个油
井y坐标与中位数差值的绝对值之和。
structpoint//定义坐标结构体
intx;
inty;
};
//快速排序
voidsort(pointa[],intsize)
inti=0,j=size-1;
inttemp;
//用来保存作为基准的数
if(size>
=1)
temp=a[0].y;
//用区间的第一个元素作为基准
while(i!
=j)//区间两端交替向中间扫描,知道i=j
while(itemp)
j--;
//从右向左扫描,找到第一个小于temp的a[j]if(i {
a[i].y=a[j].y;
i++;
while(i i++;
//从左向右扫描,找到第一个大于temp的a[i]if(i {
a[j].y=a[i].y;
a[i].y=temp;
sort(a,i);
//对左递归
sort(a+i+1,size-i-1);
//对右递归
//取中位数
intmadian(point*a,intsize)
intnum=size+1;
returna[num/2-1].y;
//returnsize%2?
a[size>
1].y:
(a[size>
1].y+a[(size>
1)+1].y)>
1;
//计算最短路程
intlucheng(point*a,intsize)
intmid=madian(a,size);
inti,sum=0;
for(i=0;
i {
sum+=abs(a[i].y-mid);
returnsum;
ifstreamfin("
ofstreamfout("
intn;
n;
point*p=newpoint[n];
for(inti=0;
i fin>
p[i].x>
p[i].y;
sort(p,n);
intminlen=lucheng(p,n);
fout return0;
问题3:
邮局选址问题
同问题2
structpoint
};
voidsort_x(point*a,intsize)
temp=a[0].x;
//
while(i!
=j)
if(i {
a[i].x=a[j].x;
a[j].x=a[i].x;
a[i].x=temp;
sort_x(a,i);
sort_x(a+i+1,size-i-1);
voidsort_y(point*a,intsize)
while(i {
a[i].y=temp;
sort_y(a,i);
sort_y(a+i+1,size-i-1);
intmadian_x(point*a,intsize)
//intnum=size+1;
//returna[num/2-1].x;
returnsize%2?
1].x:
1].x+a[(size>
1)+1].x)>
intmadian_y(point*a,intsize)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 递归 实验 报告