当前位置:文档之家› 递归算法实验报告doc

递归算法实验报告doc

递归算法实验报告篇一:递归算法的设计和实现的实验报告班级学号姓名实验组别试验日期室温报告日期成绩报告内容:(目的和要求、原理、步骤、数据、计算、小结等)实验名称:递归算法的设计和应用实验目的:1. 掌握递归算法的实现。

2. 实现递归算法的应用。

实验环境(硬/软件要求):Windows XX, Visual C++ 6.0实验内容:用递归算法实现前n个自然数的累加和与平均数【C语言源程序】#includeint Digui(int n)//设计递归算法功能为求前n个整数的和//{if(n==0)return 0;if(n==1)return 1;else return Digui(n-1)+n;}int main(){int n;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)折半查找问题的循环结构算法程序为:int Csearch(int test[],int x,int low,int high) {int i;for( i=0;i {if(x==test[i]) return i;else if(x>test[i])low=i+1;else high=i-1;}if(i>=high) return -1;}(2)①查找成功的例子:#includeint Csearch(int test[],int x,int low,int high) {int i;for( i=0;i {if(x==test[i]) return i;else if(x>test[i])low=i+1;else high=i-1;}if(i>=high) return -1;}int main(){int a[10]={1,2,3,4,5,6,7,8,9,10};int x=6,flag ;int low=0,high=10;flag=Csearch(a,x,0,10);if(flag==-1) printf("searching is failed!\n"); else printf("searching is success!\n") ;printf("This program is made by 10273206\n"); }运行结果为:②查找失败的例子为:#includeint Csearch(int test[],int x,int low,int high) {int i;for( i=0;i {if(x==test[i]) return i;else if(x>test[i])low=i+1;else high=i-1;}if(i>=high) return -1;}int main(){int a[10]={1,2,3,4,5,6,7,8,9,10};int x=11,flag ;int low=0,high=10;flag=Csearch(a,x,0,10);if(flag==-1) printf("searching is failed!\n"); else printf("searching is success!\n") ;printf("This program is made by 10273206\n"); }运行结果为:(3)程序为:#include#includeint Bsearch(int a[],int x,int low,int high) {int mid;if(low>high) return -1;mid=(low+high)/2;if(x==a[mid]) return mid;else if(x Bsearch(a,x,low,mid-1);elseBsearch(a,x,mid+1,high);}int Csearch(int test[],int x,int low,int high) {int i;for( i=0;i {if(x==test[i]) return i;else if(x>test[i])low=i+1;else high=i-1;}if(i>=high) return -1;}int main(){time_t start,end;double dif;int Bsearch(int a[],int x,int low,int high);int Csearch(int test[],int x,int low,int high);int a[10000],x,y,i,bn,flag;int low=0,high=10000,mid=0;printf("please enter number:\n");scanf("%ld",&x);for( i=0;i a[i]=i+1;time(&start);bn=Bsearch(a,x,0,10000);if(bn==-1) printf("%d is not in a !\n",x);else printf("%d is in a,suffix is %d\n",x,bn);time(&end);dif=difftime(end,start);printf("di gui method use time is:%f seconds\n",dif);time(&start);flag=Csearch(a,x,0,10000);if(flag==-1) printf("%ld is not in a !\n",x);else printf("%d is in a,suffix is %d\n",x,flag);time(&end);dif=difftime(end,start);printf("xun huan method use time is :%f seconds\n",dif);printf("This program is made by 10273206\n");}运行结果为:总结与思考通过实验我初步了解了递归算法到非递归算法的转换,递归算法在数据结构存储中用处很大。

同时,我也熟悉了递归算法的实现过程及实现机理,较熟练并掌握递归算法的设计方法。

篇三:数据结构二叉树的递归算法实验报告齐鲁工业大学实验报告成绩课程名称数据结构指导教师单健芳实验日期院(系)信息学院专业班级计科(嵌入)14-1 实验地点学生姓名高晨悦学号 XX03071007同组人无实验项目名称二叉树的递归算法一、实验目的和要求1.实现二叉树的先序,中序与后序遍历的递归算法与非递归算法。

2.求二叉树的结点个数,叶子结点个数,二叉树的高度,度为2的结点个数。

二、实验环境微型计算机vc 6.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#define Maxsize 100typedef struct TREE{struct TREE *lTree;char data;}Tree;void InitTree(Tree*);//初始化树void CreatTree(Tree*);//创建二叉树void PreTraverse(Tree*);//先序遍历递归void PreOrderTraverse(Tree*);//先序遍历非递归void InTraverse(Tree *tree);//中序遍历递归void InOrderTraverse(Tree *tree);//中序遍历非递归void PostTraverse(Tree *tree);//后序遍历递归void LastOrderTraverse(Tree *tree);//后序遍历非递归int DepthTree(Tree *tree);//计算树的深度int LeafsTree(Tree *tree);//计算叶子结点个数int NodesTree(Tree *tree);//计算结点个数int Twochild(Tree*tree);//计算度为二的结点个数void main(){int H,L; Tree tree;// Tree m;InitTree(&tree); CreatTree(&tree); cout cout InTraverse(&tree);//中序遍历递归InOrderTraverse(&tree);//中序遍历非递归cout cout H=DepthTree(&tree);cout cout }void InitTree(Tree *tree)//初始化树{}void CreatTree(Tree *tree)//创建树{int n=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);else if(i==1){Tree *rTree=(Tree*)malloc(sizeof(Tree)); tree->rTree=rTree;rTree->lTree=NULL;rTree->rTree=NULL;rTree->data='0';CreatTree(tree->rTree);}}else if(n==0) :有):"; 1。

相关主题