递归算法实验报告doc.docx
《递归算法实验报告doc.docx》由会员分享,可在线阅读,更多相关《递归算法实验报告doc.docx(6页珍藏版)》请在冰豆网上搜索。
递归算法实验报告doc
递归算法实验报告
篇一:
递归算法的设计和实现的实验报告
班级学号姓名实验组别试验日期室温报告日期成绩报告内容:
(目的和要求、原理、步骤、数据、计算、小结等)
实验名称:
递归算法的设计和应用
实验目的:
1.掌握递归算法的实现。
2.实现递归算法的应用。
实验环境(硬/软件要求):
WindowsXX,VisualC++6.0
实验内容:
用递归算法实现前n个自然数的累加和与平均数
【C语言源程序】
#include
intDigui(intn)//设计递归算法功能为求前n个整数的和//
{
if(n==0)
return0;
if(n==1)
return1;
elsereturnDigui(n-1)+n;
}
intmain()
{
intn;
printf("请输入n的值:
\n");
scanf("%d",&n);
printf("计算结果为:
\n%d\n",Digui(n));
printf("这n个数的平均数是:
\n%f\n",(float)Digui(n)/n);
}
篇二:
数据结构-递归算法实验报告
实验报告
实验五递归算法
实验目的:
1.熟悉递归算法的实现过程及实现机理;
2.熟练并掌握递归算法的设计方法;
3.了解递归算法到非递归算法的转换。
实验原理:
高级程序语言函数调用原理;
递归算法的设计方法。
实验内容:
6-14折半查找问题。
折半查找问题的描述见6.1节,折半查找问题的递归算法见例6-2。
要求:
(1)设计折半查找问题的循环结构算法;
(2)设计一个查找成功的例子和一个查找不成功的例子,并设计测试主程序;
(3)设计一个包含10000个数据元素的查找成功的例子,然后分别调用循环结构的查找算法和递归结构的查找算法,并测试出两种算法在计算机上的实际运行时间。
实验结果:
(1)折半查找问题的循环结构算法程序为:
intCsearch(inttest[],intx,intlow,inthigh)
{
inti;
for(i=0;i {
if(x==test[i])returni;
elseif(x>test[i])low=i+1;
elsehigh=i-1;
}
if(i>=high)return-1;
}
(2)①查找成功的例子:
#include
intCsearch(inttest[],intx,intlow,inthigh)
{
inti;
for(i=0;i {
if(x==test[i])returni;
elseif(x>test[i])low=i+1;
elsehigh=i-1;
}
if(i>=high)return-1;
}
intmain()
{
inta[10]={1,2,3,4,5,6,7,8,9,10};
intx=6,flag;
intlow=0,high=10;
flag=Csearch(a,x,0,10);
if(flag==-1)printf("searchingisfailed!
\n");
elseprintf("searchingissuccess!
\n");
printf("Thisprogramismadeby10273206\n");
}
运行结果为:
②查找失败的例子为:
#include
intCsearch(inttest[],intx,intlow,inthigh)
{
inti;
for(i=0;i {
if(x==test[i])returni;
elseif(x>test[i])low=i+1;
elsehigh=i-1;
}
if(i>=high)return-1;
}
intmain()
{
inta[10]={1,2,3,4,5,6,7,8,9,10};
intx=11,flag;
intlow=0,high=10;
flag=Csearch(a,x,0,10);
if(flag==-1)printf("searchingisfailed!
\n");
elseprintf("searchingissuccess!
\n");
printf("Thisprogramismadeby10273206\n");
}
运行结果为:
(3)程序为:
#include
#include
intBsearch(inta[],intx,intlow,inthigh)
{
intmid;
if(low>high)return-1;
mid=(low+high)/2;
if(x==a[mid])returnmid;
elseif(x Bsearch(a,x,low,mid-1);
else
Bsearch(a,x,mid+1,high);
}
intCsearch(inttest[],intx,intlow,inthigh)
{
inti;
for(i=0;i {
if(x==test[i])returni;
elseif(x>test[i])low=i+1;
elsehigh=i-1;
}
if(i>=high)return-1;
}
intmain()
{
time_tstart,end;
doubledif;
intBsearch(inta[],intx,intlow,inthigh);
intCsearch(inttest[],intx,intlow,inthigh);
inta[10000],x,y,i,bn,flag;
intlow=0,high=10000,mid=0;
printf("pleaseenternumber:
\n");
scanf("%ld",&x);
for(i=0;i a[i]=i+1;
time(&start);
bn=Bsearch(a,x,0,10000);
if(bn==-1)printf("%disnotina!
\n",x);
elseprintf("%disina,suffixis%d\n",x,bn);
time(&end);
dif=difftime(end,start);
printf("
diguimethodusetimeis:
%fseconds\n",dif);
time(&start);
flag=Csearch(a,x,0,10000);
if(flag==-1)printf("%ldisnotina!
\n",x);
elseprintf("%disina,suffixis%d\n",x,flag);
time(&end);
dif=difftime(end,start);
printf("xunhuanmethodusetimeis:
%fseconds\n",dif);
printf("Thisprogramismadeby10273206\n");
}
运行结果为:
总结与思考
通过实验我初步了解了递归算法到非递归算法的转换,递归算法在数据结构存储中用处很大。
同时,我也熟悉了递归算法的实现过程及实现机理,较熟练并掌握递归算法的设计方法。
篇三:
数据结构二叉树的递归算法实验报告
齐鲁工业大学实验报告成绩
课程名称数据结构指导教师单健芳实验日期
院(系)信息学院专业班级计科(嵌入)14-1实验地点
学生姓名高晨悦学号XX03071007同组人无
实验项目名称二叉树的递归算法
一、实验目的和要求
1.实现二叉树的先序,中序与后序遍历的递归算法与非递归算法。
2.求二叉树的结点个数,叶子结点个数,二叉树的高度,度为2的结点个数。
二、实验环境
微型计算机vc6.0
三、实验内容
1.实现二叉树的先序,中序与后序遍历的递归算法与非递归算法。
2.求二叉树的结点个数,叶子结点个数,二叉树的高度,度为2的结点个数。
四、实验步骤
一.实验内容
1.实现二叉树的先序,中序与后序遍历的递归算法与非递归算法。
2.求二叉树的结点个数,叶子结点个数,二叉树的高度,度为2的结点个数。
二.程序的设计思想
1实现二叉树的先序,中序与后序遍历的递归算法与非递归算法。
先构造二叉树,根据先序遍历的思想,输入根后,再输入左子树,直至左子树为空则输入上一层右字树。
(1)二叉树的非递归遍历是用显示栈来存储二叉树的结点指针,先序遍历时,按二叉树前序遍历的顺序访问结点,并将结点的指针入栈,直到栈顶指针指向结点的左指针域为空时取出栈顶指针并删除栈顶指针,访问刚取出的指针指向的结点的右指针指向的结点并将其指针入栈,如此反复执行则为非递归操作。
(2)二叉树的递归遍历:
若二叉树为空,则空操作
先序遍历:
(a)访问根结点;
(b)先序遍历左子树;
(c)先序遍历右子树。
中序遍历:
(a)中序遍历左子树;
(b)访问根结点;
(c)中序遍历右子树
后序遍历:
(a)后序遍历左子树;
(b)后序遍历右子树;
(c)访问根结点。
2.求二叉树的结点个数,叶子结点个数,二叉树的高度,度为2的结点个数。
(1)求二叉树的叶子结点个数:
先分别求得左右子树中个叶子结点的个数,再计算出两者之和即为二叉树的叶子结点数。
(2)二叉树的结点个数之和:
先分别求得左子树右子树中结点之和,再计算两者之和即为所求。
(3)二叉树的高度:
首先判断二叉树是否为空,若为空则此二叉树高度为0,。
否则,就先分别求出左右子树的深度进行比较,取较大的树加一即为所求。
(4)二叉树的度为2的结点个数:
计算有左右孩子的结点个数,即为度为2的结点个数。
三.编程过程中遇到的问题及解决办法
(1)后续遍历的非递归函数涉及到回溯的方法,开始设计的方案想的太过于简单,所以形成了死循环,总是在最后的节点处不停地循环,后改成回溯后,该问题得到解决。
(2)计算二叉树中度为2的结点个数中,返回循环的时候不论根结点有没有左右子树,但个人设计时,根总是会将自己默认为有左右子树,自行增加1.后在同学帮助下才看到自己的这个失误。
四.程序的闪光点(自我评价)
1.程序模块化,各个函数分开描述,方便观察
2.关键处有注释
3.建立二叉树时,用先序提示输入,比较人性化。
五.程序源代码(以文件为单位提供)
#include
#include
#defineMaxsize100
typedefstructTREE{
structTREE*lTree;
chardata;
}Tree;
voidInitTree(Tree*);//初始化树
voidCreatTree(Tree*);//创建二叉树
voidPreTraverse(Tree*);//先序遍历递归
voidPreOrderTraverse(Tree*);//先序遍历非递归
voidInTraverse(Tree*tree);//中序遍历递归
voidInOrderTraverse(Tree*tree);//中序遍历非递归
voidPostTraverse(Tree*tree);//后序遍历递归
voidLastOrderTraverse(Tree*tree);//后序遍历非递归
intDepthTree(Tree*tree);//计算树的深度
intLeafsTree(Tree*tree);//计算叶子结点个数
intNodesTree(Tree*tree);//计算结点个数
intTwochild(Tree*tree);//计算度为二的结点个数
voidmain()
{
intH,L;Treetree;
//Treem;
InitTree(&tree);CreatTree(&tree);cout cout InTraverse(&tree);//中序遍历递归
InOrderTraverse(&tree);//中序遍历非递归cout cout H=DepthTree(&tree);
cout cout }
voidInitTree(Tree*tree)//初始化树
{
}
voidCreatTree(Tree*tree)//创建树
{
intn=0,m=0,i=0;tree->lTree=NULL;tree->rTree=NULL;tree->data='0';cout {}coutdata>tree->data;cin>>n;
if(n==1)
{
Tree*lTree=(Tree*)malloc(sizeof(Tree));
tree->lTree=lTree;
lTree->lTree=NULL;
lTree->rTree=NULL;
lTree->data='0';
CreatTree(tree->lTree);
coutdata>i;
if(i==0);
elseif(i==1)
{
Tree*rTree=(Tree*)malloc(sizeof(Tree));tree->rTree=rTree;
rTree->lTree=NULL;
rTree->rTree=NULL;
rTree->data='0';
CreatTree(tree->rTree);
}
}
elseif(n==0):
有):
";1