递归算法实验报告doc文档格式.docx
- 文档编号:21891448
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:6
- 大小:17.23KB
递归算法实验报告doc文档格式.docx
《递归算法实验报告doc文档格式.docx》由会员分享,可在线阅读,更多相关《递归算法实验报告doc文档格式.docx(6页珍藏版)》请在冰豆网上搜索。
intmain()
intn;
printf("
请输入n的值:
\n"
);
scanf("
%d"
&
n);
计算结果为:
\n%d\n"
Digui(n));
这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
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!
elseprintf("
searchingissuccess!
);
Thisprogramismadeby10273206\n"
运行结果为:
②查找失败的例子为:
intx=11,flag;
(3)程序为:
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);
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;
pleaseenternumber:
%ld"
x);
i a[i]=i+1;
time(&
start);
bn=Bsearch(a,x,0,10000);
if(bn==-1)printf("
%disnotina!
x);
%disina,suffixis%d\n"
x,bn);
end);
dif=difftime(end,start);
diguimethodusetimeis:
%fseconds\n"
dif);
flag=Csearch(a,x,0,10000);
%ldisnotina!
x,flag);
xunhuanmethodusetimeis:
总结与思考
通过实验我初步了解了递归算法到非递归算法的转换,递归算法在数据结构存储中用处很大。
同时,我也熟悉了递归算法的实现过程及实现机理,较熟练并掌握递归算法的设计方法。
篇三:
数据结构二叉树的递归算法实验报告
齐鲁工业大学实验报告成绩
课程名称数据结构指导教师单健芳实验日期
院(系)信息学院专业班级计科(嵌入)14-1实验地点
学生姓名高晨悦学号XX03071007同组人无
实验项目名称二叉树的递归算法
一、实验目的和要求
1.实现二叉树的先序,中序与后序遍历的递归算法与非递归算法。
2.求二叉树的结点个数,叶子结点个数,二叉树的高度,度为2的结点个数。
二、实验环境
微型计算机vc6.0
三、实验内容
四、实验步骤
一.实验内容
二.程序的设计思想
1实现二叉树的先序,中序与后序遍历的递归算法与非递归算法。
先构造二叉树,根据先序遍历的思想,输入根后,再输入左子树,直至左子树为空则输入上一层右字树。
(1)二叉树的非递归遍历是用显示栈来存储二叉树的结点指针,先序遍历时,按二叉树前序遍历的顺序访问结点,并将结点的指针入栈,直到栈顶指针指向结点的左指针域为空时取出栈顶指针并删除栈顶指针,访问刚取出的指针指向的结点的右指针指向的结点并将其指针入栈,如此反复执行则为非递归操作。
(2)二叉树的递归遍历:
若二叉树为空,则空操作
先序遍历:
(a)访问根结点;
(b)先序遍历左子树;
(c)先序遍历右子树。
中序遍历:
(a)中序遍历左子树;
(b)访问根结点;
(c)中序遍历右子树
后序遍历:
(a)后序遍历左子树;
(b)后序遍历右子树;
(c)访问根结点。
(1)求二叉树的叶子结点个数:
先分别求得左右子树中个叶子结点的个数,再计算出两者之和即为二叉树的叶子结点数。
(2)二叉树的结点个数之和:
先分别求得左子树右子树中结点之和,再计算两者之和即为所求。
(3)二叉树的高度:
首先判断二叉树是否为空,若为空则此二叉树高度为0,。
否则,就先分别求出左右子树的深度进行比较,取较大的树加一即为所求。
(4)二叉树的度为2的结点个数:
计算有左右孩子的结点个数,即为度为2的结点个数。
三.编程过程中遇到的问题及解决办法
(1)后续遍历的非递归函数涉及到回溯的方法,开始设计的方案想的太过于简单,所以形成了死循环,总是在最后的节点处不停地循环,后改成回溯后,该问题得到解决。
(2)计算二叉树中度为2的结点个数中,返回循环的时候不论根结点有没有左右子树,但个人设计时,根总是会将自己默认为有左右子树,自行增加1.后在同学帮助下才看到自己的这个失误。
四.程序的闪光点(自我评价)
1.程序模块化,各个函数分开描述,方便观察
2.关键处有注释
3.建立二叉树时,用先序提示输入,比较人性化。
五.程序源代码(以文件为单位提供)
#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(&
cout cout InTraverse(&
//中序遍历递归
InOrderTraverse(&
//中序遍历非递归cout cout H=DepthTree(&
cout cout }
voidInitTree(Tree*tree)//初始化树
voidCreatTree(Tree*tree)//创建树
intn=0,m=0,i=0;
tree->
lTree=NULL;
rTree=NULL;
data='
0'
;
cout {}coutdata>
tree->
data;
cin>
>
n;
Tree*lTree=(Tree*)malloc(sizeof(Tree));
tree->
lTree=lTree;
lTree->
CreatTree(tree->
lTree);
coutdata>
i;
if(i==0);
elseif(i==1)
Tree*rTree=(Tree*)malloc(sizeof(Tree));
rTree=rTree;
rTree->
rTree);
elseif(n==0):
有):
"
1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 递归 算法 实验 报告 doc