数据结构实验:递归程序设计-精简

合集下载

python递归实验报告

python递归实验报告

python递归实验报告Python递归实验报告引言:递归是计算机科学中一种重要的编程技术,它在解决问题时能够简化代码逻辑,并提高代码的可读性和可维护性。

Python作为一种高级编程语言,提供了强大的递归支持,本文将通过实验来探讨Python递归的特性和应用。

一、递归的概念与原理递归是一种通过调用自身的方式解决问题的方法。

在递归过程中,问题被分解为更小的子问题,直到子问题足够简单可以直接求解。

递归的基本原理是将一个大问题转化为一个或多个与原问题相似但规模更小的子问题,通过递归调用解决子问题,最终得到原问题的解。

二、递归的实现方式在Python中,递归可以通过函数调用自身来实现。

递归函数通常包含两个部分:基准情况和递归情况。

基准情况是递归函数的结束条件,当满足基准情况时,递归函数将不再调用自身,而是返回一个特定的值。

递归情况是指递归函数在未满足基准情况时,调用自身来处理更小规模的子问题。

三、递归的应用场景1. 阶乘计算阶乘是指从1到给定数之间所有整数的乘积。

递归可以很方便地实现阶乘计算,如下所示:```pythondef factorial(n):if n == 0:return 1else:return n * factorial(n-1)```2. 斐波那契数列斐波那契数列是指从第三项开始,每一项都等于前两项之和。

递归可以很容易地实现斐波那契数列的计算,如下所示:```pythondef fibonacci(n):if n <= 1:return nelse:return fibonacci(n-1) + fibonacci(n-2)```3. 文件夹遍历递归还可以用于文件夹的遍历,通过递归调用实现对文件夹内所有文件的查找和处理。

例如,可以编写一个函数来计算指定文件夹下所有文件的总大小:```pythonimport osdef get_folder_size(folder):size = 0for item in os.listdir(folder):item_path = os.path.join(folder, item)if os.path.isfile(item_path):size += os.path.getsize(item_path)elif os.path.isdir(item_path):size += get_folder_size(item_path)return size```四、递归的优缺点递归的优点在于能够简化问题的解决过程,提高代码的可读性和可维护性。

c语言递归算法实验报告,递归算法的设计与实现实验报告-read.doc

c语言递归算法实验报告,递归算法的设计与实现实验报告-read.doc

c语⾔递归算法实验报告,递归算法的设计与实现实验报告-read.doc递归算法的设计与实现实验报告-read递归算法的设计与实现实验报告⼀、实验⽬的:a)掌握递归算法的基本思想及其与数学归纳法的关系;b)掌握递归算法设计与实现。

⼆、实验内容a)⽤递归算法计算n!;b)⽤递归⽅法求⾮负整数a和b(a,b不全为0)的最⼤公约数。

三、实验要求a)⽤伪代码计算n!和求⾮负整数a,b(a,b不全为零)的最⼤公约数的递归算法;b)⽤C++语⾔实现算法并测试通过;c)⽐较采⽤欧⽒算法和递归算法求⾮负a,b(a,b不全为零)的最⼤公约数的执⾏效率。

四、(⼀)使⽤递归算法求n!的伪代码表⽰:1.Procedurefactorial (n)2. if n= = 0 then3. return (1)4. return (n * factorial (n-1))5. end(⼆)使⽤递归算法求⾮负整数a和b(a,b不全为0)的最⼤公约数的伪代码表⽰:输⼊:a和b(不全为0的⾮负整数)输出:a和b的最⼤公约数1. Procedure gcd_recurs (a, b)2. if a3. swap (a, b)4. if b = 0 then5. return (a)6. a 除以 b 得到 a = bq + r ,0 £ r < b7. redurn (gcd_recurs (b, r))8. end gcd_recurs五、(⼀)使⽤递归算法求n!的C语⾔实现:#include"stdio.h"long fac(int n){long result;if(n==0||n==1)result=1;elseresult=n*fac(n-1);return result;}main(){int x;long f;printf("please input one numbers: ");scanf("%d",&x);if(x<=0)printf("ERROR!\n");else{f=fac(x);printf("%d!=%ld\n",x,f);}}结果截图:(⼆)使⽤递归算法求⾮负整数a和b(a,b不全为0)的最⼤公约数的C语⾔实现:#include"stdio.h"int gcd(int a,int b){int temp,c;if(a{temp=a;a=b;b=temp;}if(b==0)return a;else{c=a%b;return(gcd(b,c));}}main(){int a,b;printf("please input two numbers:\n");scanf("%d%d",&a,&b);printf("gcd(%d,%d)=%d\n",a,b,gcd(a,b));}结果截图:六、⽐较采⽤欧⽒算法和递归算法求⾮负a,b(a,b不全为零)的最⼤公约数的执⾏效率。

国家开放大学《数据结构》课程实验报告(实验3 ——栈、队列、递归设计)参考答案

国家开放大学《数据结构》课程实验报告(实验3 ——栈、队列、递归设计)参考答案
{
x=Pop(s); /*出栈*/
printf("%d ",x);
InQueue(sq,x); /*入队*/
}
printf("\n");
printf("(10)栈为%s,",(StackEmpty(s)?"空":"非空"));
printf("队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
ElemType Pop(SeqStack *s); /*出栈*/
ElemType GetTop(SeqStack *s); /*取栈顶元素*/
void DispStack(SeqStack *s); /*依次输出从栈顶到栈底的元素*/
void DispBottom(SeqStack *s); /*输出栈底元素*/
} SeqQueue; /*定义顺序队列*/
void InitStack(SeqStack *s); /*初始化栈*/
int StackEmpty(SeqStack *s); /*判栈空*/
int StackFull(SeqStack *s); /*判栈满*/
void Push(SeqStack *s,ElemType x); /*进栈*/
sq=(SeqQueue *)malloc(sizeof(SeqQueue));
InitQueue(sq);
printf("(8)队列为%s\n",(QueueEmpty(sq)?"空":"非空"));
printf("(9)出栈/入队的元素依次为:");

递归算法实验报告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");}运行结果为:总结与思考通过实验我初步了解了递归算法到非递归算法的转换,递归算法在数据结构存储中用处很大。

数据结构实验报告2栈、队列、递归程序设计

数据结构实验报告2栈、队列、递归程序设计
计算机科学与技术(本科)《数据结构》实验报告
日期:学号:姓名:
实验名称:实验报告二栈、队列、递归程序设计
实验目的与要求:
2.1栈和队列的基本操作
(1)正确理解栈的先进后出的操作特点,建立初始栈,通过相关操作显示栈底元素。
(2)程序中要体现出建栈过程和取出栈底元素后恢复栈的入栈过程,按堆栈的操作规则打印结果栈中的元素
{
return(s->top==-1);
}
//---出栈函数
int Pop(SeqStack *&s,ElemType &e)
{
if (s->top==-1)
return 0;
e=s->data[s->top];
s->top--;
return 1;
}
//---初始队列函数
void InitQueue(SqQueue *&q)
q->rear=(q->rear+1)%MaxSize;
q->elem[q->rear]=e;
return 1;
}
//---出队列函数
int OutQueue(SqQueue *&q,ElemType &e)
{
if (q->front==q->rear) //队空
return 0;
q->front=(q->front+1)%MaxSize;
printf("(10)栈为%s,",(StackEmpty(s)?"空":"非空"));
printf("队列为%s\n",(QueueEmpty(q)?"空":"非空"));

实验一 循环与递归

实验一 循环与递归

实验一循环与递归一、实验目的进一步理解循环与递归程序设计的基本思想,充分利用基本的机械化操作设计高质量的算法。

二、实验要求1、上机前的准备工作根据实验内容中所给题目,利用所学循环与递归的基本设计思想设计算法并编写好上机程序,以提高上机效率;2、独立上机,输入、调试所编程序;3、上机结束后,写出实验报告。

4、上机时间:2学时三、实验内容1、核反应堆中有α和β两种粒子,每秒钟内一个α粒子可以反应产生3个β粒子,而一个β粒子可以反应产生1个α粒子和2个β粒子。

若在t=0时刻的反应堆中只有一个α粒子,求在t时刻的反应堆中α粒子和β粒子数。

#include <iostream>using namespace std;int X(int n);int Y(int n){if(n==1) return 3;return 3*X(n-1)+2*Y(n-1);}int X(int n){if(n==1) return 0;return Y(n-1);}void main(){int t;cout<<"请输入t的值:";cin>>t;cout<<"粒子的个数依次为:"<<X(t)<<","<<Y(t)<<endl;}运行结果:2、求这样的两位数据:五位数=3*四位数,9个数字各不相同#include <iostream>using namespace std;int main(){long x, y1, y2;int p[10],i,t,k;for (x=3334;x<=9999; x++){for(i=0; i<=9; i=i+1)p[i]=0;y1=3*x ;k=0;y2=10000*y1+x;while(y2>=0){t=y2 % 10;if(p[t]==1)break;y2=y2/10;p[t]++;k++;}if(k==9)cout<<"四位数:"<<x<<","<<"五位数:"<< y1<<endl;}}运行结果:3、A、B、C、D、E五人为某次竞赛的前五名,他们在比赛前猜名次:A说:B得第三名,C得第五名B说:D得第二名,E得第四名C说:B得第一名,E得第四名D说:C得第一名,B得第二名E说:D得第二名,A得第三名结果每个人都猜对了一半,实际名次是什么?#include <iostream>using namespace std;void main( ){int a,b,c,d,e;for( a=1;a<=5;a++)for( b=1;b<=5;b++)if (a!=b)for( c=1;c<=5;c++)if (c!=a&&c!=b)for( d=1;d<=5;d++)if (d!=a && d!=b && d!=c ){e=15-a-b-c-d;if (e!=a&&e!=b&& e!=c&&e!=d)if(((c==5)+(b==3))==1&&((d==2)+(e==4))==1&& ((b==1)+(e==4))==1&& ((c==1)+(b==2))==1&& ((d==2)+(a==3))==1)cout<< "a,b,c,d,e="<<a<<b<<c<<d<<e<<endl;}}运行结果:4、从下列题中任选其一:1)国王分财产。

算法设计与分析:递归与分治法-实验报告(总8页)

算法设计与分析:递归与分治法-实验报告(总8页)

算法设计与分析:递归与分治法-实验报告(总8页)实验目的:掌握递归与分治法的基本思想和应用,学会设计和实现递归算法和分治算法,能够分析和评价算法的时间复杂度和空间复杂度。

实验内容:1.递归算法的设计与实现3.算法的时间复杂度和空间复杂度分析实验步骤:1)递归定义:一个函数或过程,在其定义或实现中,直接或间接地调用自身的方法,被成为递归。

递归算法是一种控制结构,它包含了解决问题的基础情境,也包含了递归处理的情境。

2)递归特点:递归算法具有以下特点:①依赖于递归问题的部分解被划分为若干较小的部分。

②问题的规模可以通过递推式递减,最终递归终止。

③当问题的规模足够小时,可以直接求解。

3)递归实现步骤:①确定函数的定义②确定递归终止条件③确定递归调用的过程4)经典实例:斐波那契数列递推式:f(n) = f(n-1) + f(n-2)int fib(int n) {if (n <= 0)return 0;else}5)优化递归算法:避免重复计算例如,上述斐波那契数列的递归算法会重复计算一些中间结果,影响效率。

可以使用动态规划技术,将算法改为非递归形式。

int f1 = 0, f2 = 1;for (int i = 2; i <= n; i++) {f1 = f2;使用循环避免递归,重复计算可以大大减少,提高效率。

1)分治算法的定义:将原问题分解成若干个规模较小且类似的子问题,递归求解子问题,然后合并各子问题得到原问题的解。

2)分治算法流程:②将问题分解成若干个规模较小的子问题。

③递归地解决各子问题。

④将各子问题的解合并成原问题的解。

3)分治算法实例:归并排序归并排序是一种基于分治思想的经典排序算法。

排序流程:②分别对各子数组递归进行归并排序。

③将已经排序好的各子数组合并成最终的排序结果。

实现源代码:void mergeSort(int* arr, int left, int right) {if (left >= right)while (i <= mid && j <= right)temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];temp[k++] = arr[i++];1) 时间复杂度的概念:指完成算法所需的计算次数或操作次数。

递归实验报告

递归实验报告

递归实验报告递归实验报告引言递归是计算机科学中一种重要的概念,它在问题解决和算法设计中起到了关键的作用。

本文将对递归进行实验探究,通过编写一些递归函数来解决不同类型的问题,并对其性能和应用进行评估。

一、递归的基本原理递归是一种通过调用自身来解决问题的方法。

它包含两个重要的要素:基本情况和递归情况。

基本情况是指问题可以直接解决的情况,而递归情况则是指问题需要通过调用自身来解决的情况。

在递归函数中,我们需要确保递归情况能够最终达到基本情况,否则会出现无限递归的情况。

二、递归的应用1. 阶乘计算阶乘是一个常见的递归应用。

我们可以定义一个递归函数来计算一个正整数的阶乘。

例如,计算5的阶乘可以通过调用函数fact(5)来实现。

在函数内部,我们将问题转化为计算4的阶乘,并不断递归下去,直到问题达到基本情况,即计算1的阶乘为止。

2. 斐波那契数列斐波那契数列也是递归的一个经典应用。

该数列的定义是:第一个和第二个数为1,从第三个数开始,每个数都是前两个数之和。

我们可以编写一个递归函数来计算斐波那契数列中的第n个数。

在函数内部,我们将问题转化为计算第n-1个数和第n-2个数的和,并不断递归下去,直到问题达到基本情况,即计算第一个或第二个数为止。

三、递归的性能评估递归在解决某些问题时可以提供简洁的解决方案,但也可能带来性能上的问题。

递归函数的调用涉及到函数的压栈和弹栈操作,这会增加程序的开销。

在处理大规模问题时,递归可能导致栈溢出的问题。

因此,在使用递归时,我们需要仔细评估其性能,确保其适用于当前的问题规模。

四、递归的优化技巧为了提高递归函数的性能,我们可以采用一些优化技巧。

其中一种常见的优化方法是尾递归优化。

尾递归是指递归函数在递归调用时,只返回递归函数本身的结果,而不进行其他的计算。

这样可以减少函数调用的开销,提高程序的执行效率。

五、结论递归是一种强大的问题解决方法,它在计算机科学中有着广泛的应用。

通过实验我们可以发现,递归函数可以提供简洁的解决方案,但在处理大规模问题时需要注意其性能问题。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验名称:实验六递归程序设计(实验报告)
一.实验目的:
1. 理解递归程序设计基本方法
2.理解递归的三大要素
二.实验内容:
1. 根据整数乘法运算的特点,给出整数乘法运算的递归实现
2、编写一个递归实现整数之间乘法运算的函数,并进行测试,验证设计的正确性。

二、实验原理:
1、什么是递归:
在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。

若调用自身,称之为直接递归。

若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。

如果一个递归过程或递归函数中递归调用语句是最后一条执行语句,则称这种递归调用为尾递归。

2、以下三种情况使用递归:
2.1、问题的定义是递归的。

2.2、数据结构是递归的。

2.3、问题求解的过程是递归的。

3、递归算法的设计方法:
先将整个问题划分为若干个子问题,通过分别求解子问题,最后获得整个问题的解。

而这些子问题具有与原问题相同的求解方法,于是可以再将它们划分成若干个子问题,分别求解,如此反复进行,直到不能再划分成子问题,或已经可以求解为止。

4.递归算法的执行过程:
4.1递归算法的执行过程是不断地自调用,直到到达递归出口才结束自调用过程;
4.2到达递归出口后,递归算法开始按最后调用的过程最先返回的次序返回;
4.3返回到最外层的调用语句时递归算法执行过程结束。

2.实验流程:
1、编辑主函数并初始化优先级队列;
2、通过函数调用完成程序设计;
3、运行编译函数,查看结果
四.程序代码:
1.主程序
#include "stdio.h"
mult(int x,int y)
{
if (y==1) return x;
else
return x+mult(x,y-1);
}
void main()
{
int j,k,m;
printf("请输入两个乘数:\n");
scanf("%d %d",&j,&k);
printf("结果为:\n");
m=mult(j,k);
printf("%d",m);
printf("\n");
}
}
2.实验结果:
结果分析:由实验结果可知,成功的完成了对递归的操作,可见能实现乘数的功能实现,实验基本成功。

五.心得体会:
在本次试验中,主要是熟悉对递归操作,虽然这些操作的基本原理都比较熟悉,但是实际上机时还是出现了不少问题,但是有与编程能力太差,还有时间问题,所以实验不是很成功,对递归概念还是有些不清楚,所以还要再接再厉,争取有更多的收获。

相关文档
最新文档