递归实验报告.docx
- 文档编号:23001866
- 上传时间:2023-04-30
- 格式:DOCX
- 页数:15
- 大小:18.97KB
递归实验报告.docx
《递归实验报告.docx》由会员分享,可在线阅读,更多相关《递归实验报告.docx(15页珍藏版)》请在冰豆网上搜索。
递归实验报告
递归实验报告
篇一:
字符串,递归实验报告
宁波工程学院电信学院计算机教研室
实验报告
一、实验目的
1)熟悉串的定义和串的基本操作。
2)加深对串数据结构的理解,逐步培养解决实际问题的编程能力。
3)熟悉递归的定义和递归的算法设计。
4)加深对递归算法的理解,逐步培养解决实际问题的编程能力。
二、实验环境
装有VisualC++6.0的计算机。
三、实验内容
1、凯撒加密算法
凯撒密码(caeser)是罗马扩张时期朱利斯?
凯撒(JuliusCaesar)创造的,用于加密通过信使传递的作战命令。
它将字母表中的字母移动一定位置而实现加密。
他的原理很简单,说到底就是字母与字母之间的替换。
每一个字母按字母表顺序向后移3位,如a加密后变成d,b加密后变成e,······x加密后变成a,y加密后变成b,z加密后变成c。
例如:
“baidu”用凯撒密码法加密后字符串变为“edlgx”。
试写一个算法,将键盘输入的文本字符串(只包含a~z的字符)进行加密后输出。
另写一个算法,将已加密后的字符串解密后输出。
提示:
?
如果有字符变量c加密后则=’a’+(c-‘a’+3)%26
?
采用顺序结构存储串,键盘输入字符串后保存到顺序串中;输出用顺序串的输出函数。
程序:
#include
#defineMaxSize100
typedefstruct//串的类型定义
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)//开始加密
{
inti;
for(i=0;i {
if(s.ch[i]>='a'&&s.ch[i] t.ch[i]='a'+(s.ch[i]-'a'+3)%26;//将每一个字母按字母表顺序向后移3位
else
t.ch[i]=s.ch[i];//如果字符不是字母a~z,则原样保留
}
t.len=s.len;
}
voidRecoverString(SqStrings,SqString&t)//开始解密
{
inti;
for(i=0;i {
if(s.ch[i]>='d'&&s.ch[i] t.ch[i]=s.ch[i]-3;
elseif(s.ch[i]>='a'&&s.ch[i] t.ch[i]=s.ch[i]+23;
else
t.ch[i]=s.ch[i];//如果字符不是字母a~z,则原样保留}
t.len=s.len;
}
voidDispString(SqStrings)//输出字符串
inti=0;
while(i {
printf("%c",s.ch[i]);//字母的逐个输出
i++;
}
printf("\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。
程序:
#include
#include
#include
constintN=20;//最多皇后个数
intcount=0;//记录解个数
intq[N];//存放皇后各皇后所在的行号
voidprint(intn){//输出一个解
inti;
count++;
printf("第%d个解",count);
for(i=1;i printf("%d",q[i]);
printf("\n");
}
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是否同对角线
return0;
j++;
}
return1;
}
voidplace(intk,intn){//第k个皇后放到第k列上
if(k>n)//所有皇后放置结束
print(n);
else
for(inti=1;i if(find(i,k)){
q[k]=i;
}
}
intmain(void){
intn;
printf("皇后个数:
\n");
scanf("%d",&n);
place(1,n);
return0;
}
本实验,我参考书本上串的基本运算算法并加以修改,添加主程序,调用函数实现的。
通过观察和思考书本上的三个程序的作用,发现可以通过调用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"
#include"conio.h"
longchengfa(intx,inty,inta)
{
intz;
a=x*y;
if(y=1)printf("%d",a);
if(y>1)
{a=x+chengfa(x,y-1,a);
printf("%d",a);
}
}
main()
{
intx,y,z,a;
printf("qingyicishurubeichenghechengwu:
\n");
scanf("%d%d",&x,&y);
printf("chengjiwei:
\n");
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)种方法。
实验代码:
#include
#include
usingnamespacestd;
intjihehuafen(intn,intm)
{
if(m==1||n==m)
return1;
else
returnjihehuafen(n-1,m-1)+m*jihehuafen(n-1,m);}
intmain()
{
ifstreamfin("C:
/input.txt");
ofstreamfout("C:
/output.txt");
intN,M,num;
fin>>N>>M;
num=jihehuafen(N,M);
fout return0;
}
问题2:
输油管道
算法思想:
由于主管道由东向西铺设。
故主管道的铺设位置只和各油井的y坐标有关。
要使主管道的y坐标最小,主管道的位置y坐标应是各个油井y坐标的中位数。
先用快速排序法把各个油井的y坐标排序,然后取其中位数再计算各个油
井y坐标与中位数差值的绝对值之和。
实验代码:
#include
#include
#include
usingnamespacestd;
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;
j--;
}
}
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;
}
intmain()
{
ifstreamfin("C:
/input.txt");
ofstreamfout("C:
/output.txt");
intn;
fin>>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
实验代码:
#include
#include
#include
usingnamespacestd;
structpoint
{
intx;
inty;
};
voidsort_x(point*a,intsize)
{
inttemp;
inti=0,j=size-1;
if(size>=1)
{
temp=a[0].x;//
while(i!
=j)
{
while(itemp)
j--;
if(i {
a[i].x=a[j].x;
i++;
}
while(i i++;
if(i {
a[j].x=a[i].x;
j--;
}
}
a[i].x=temp;
sort_x(a,i);//
sort_x(a+i+1,size-i-1);//
}
}
voidsort_y(point*a,intsize)
{
inttemp;
inti=0,j=size-1;
if(size>=1)
{
temp=a[0].y;//
while(i {
while(itemp)
j--;
if(i {
a[i].y=a[j].y;
i++;
}
while(i i++;
if(i {
a[j].y=a[i].y;
j--;
}
}
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?
a[size>>1].x:
(a[size>>1].x+a[(size>>1)+1].x)>>1;}
intmadian_y(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)
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 递归 实验 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)