循环与递归算法实验
实验一 循环与递归
实验一循环与递归一、实验目的进一步理解循环与递归程序设计的基本思想,充分利用基本的机械化操作设计高质量的算法。
二、实验要求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)国王分财产。
实验1:循环与递归算法实验
实验一:循环与递归算法的应用【实验目的】1.掌握循环、递归算法的基本思想、技巧和效率分析方法。
2.熟练掌握循环和递归的设计要点,清楚循环和递归的异同。
3.学会利用循环、递归算法解决实际问题。
【实验内容】1. 问题描述:(1)题目一:打印图形编程打印如下图所示的N阶方阵。
1 3 6 10 152 5 9 144 8 137 1211(2)题目二:计算前n项和根据参数n,计算1+2+……+n。
要求:用循环和递归分别实现(3)题目三:回文判断判断s字符串是否为“回文”的递归程序。
2. 数据输入:个人设定,由键盘输入。
3. 要求:(1)上述题目一、二必做,题目三选做;(2)独立完成实验及实验报告。
【具体实现过程】题目一:【算法分析】通过两个for循环控制数字的输出。
【实现代码】#include<stdio.h>int main(){int i,j,k,n,l,middle,temp;printf("请输入n的大小\n");scanf("%d",&n);k = 1;temp = 0;middle = 0;for(i=1;i<=n;i++){middle = i+1;k += temp;printf("%d ",k);l = k;for(j=n;j>0;j--){if(j==1)printf("\n");else{l += middle;printf("%d ",l);middle++;}}temp++;n--;}return 0;}题目二:【算法分析】定义一个sum函数求和,把求出的新值赋给sum,最后求得的值即为前n项和。
【实现代码】递归#include "stdio.h"int fun(int num){int sum;if( num==1)sum=1;elsesum=num+fun(num-1);return sum;}void main(){int n,s;printf("n=");scanf("%d",&n);s=fun(n);printf("s=%d\n",s);}循环#include<stdio.h>void main(){int sum=0;int n,i=1;printf("n=");scanf("%d",&n);while(i<=n){sum+=i*i;i++;}printf("%d",sum);}【实验心得】通过本实验掌握循环、递归算法的基本思想、技巧和效率分析方法。
实验三:分别用for,while和do-while循环语句以及递归方法计算n!,并输出算式
实验三:分别⽤for,while和do-while循环语句以及递归⽅法计
算n!,并输出算式
1.for循环语句计算n!
2.while循环语句计算n!
3.do-while语句计算n!
4.递归⽅法计算n!
5.⼼得:在此次实验中不知道如何从键盘进⾏输⼊,通过百度后找到⼀种容易理解的输⼊⽅法,通过调试达到了实验⽬的。
在使⽤
for,while和do-while循环语句进⾏计算n!输出时应该注意这三种循环语句执⾏顺序。
采⽤递归⽅法进⾏调试时问题⽐较多,不知道如何进⾏调试,通过百度查找但不太理解,所以希望能得到⽼师和同学的帮助。
递归算法是以前的知识,由于以前学习不扎实导致此次的问题,在以后的学习过程中会认真学习,不会的薄弱的知识点重新进⾏学习。
数据结构- 递归算法实验报告
通过实验我初步了解了递归算法到非递归算法的转换,递归算法在数 据结构存储中用处很大。同时,我也熟悉了递归算法的实现过程及实现 机理,较熟练并掌握递归算法的设计方法。
②查找失败的例子为: #include<stdio.h> int Csearch(int test[],int x,int low,int high) {
int i; for( i=0;i<high;i=(low+high)/2) {
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<stdio.h> #include<time.h> int 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;
递归算法实习报告
#### 一、实习背景随着计算机科学的发展,算法在各个领域中的应用日益广泛。
递归算法作为一种重要的算法设计方法,因其简洁、直观和强大的功能而被广泛应用于各种问题求解中。
为了更好地理解和掌握递归算法,我们开展了为期两周的递归算法实习,通过实际操作和理论分析,加深对递归算法的理解和应用。
#### 二、实习目的1. 掌握递归算法的基本概念和设计方法。
2. 熟悉递归算法在解决实际问题中的应用。
3. 培养团队协作能力和问题解决能力。
#### 三、实习内容1. 递归算法的基本概念实习期间,我们首先学习了递归算法的基本概念。
递归算法是一种直接或间接地调用自身的方法,它通过将问题分解为规模更小的同类问题来解决原问题。
递归算法的特点是简洁、直观,但同时也存在潜在的性能问题。
2. 递归算法的设计方法为了更好地理解和应用递归算法,我们学习了递归算法的设计方法。
主要包括:(1)确定递归关系的基准情况:即递归算法终止的条件。
(2)确定递归关系:将原问题分解为规模更小的同类问题。
(3)确定递归函数:实现递归算法的核心部分。
3. 递归算法的实际应用在掌握了递归算法的基本概念和设计方法后,我们开始学习递归算法在实际问题中的应用。
以下是一些典型的应用案例:(1)斐波那契数列:递归算法可以轻松求解斐波那契数列。
(2)汉诺塔问题:递归算法可以解决经典的汉诺塔问题。
(3)快速排序:递归算法可以实现高效的快速排序算法。
4. 团队协作与问题解决在实习过程中,我们分成小组进行讨论和合作,共同解决实际问题。
通过团队合作,我们不仅提高了问题解决能力,还培养了团队协作精神。
#### 四、实习成果1. 理论知识通过实习,我们对递归算法的基本概念、设计方法和应用有了更深入的了解。
2. 实际操作我们成功地实现了斐波那契数列、汉诺塔问题和快速排序等递归算法。
3. 问题解决能力在实习过程中,我们学会了如何分析问题、设计算法和解决问题。
4. 团队协作能力通过小组合作,我们学会了如何与他人沟通、协调和合作。
递归算法的实验报告
递归算法的实验报告引言递归算法是计算机科学中一种重要的算法思想,通过将问题分解为更小的子问题并逐步解决,从而实现问题的求解。
本实验旨在探讨递归算法的原理,并通过具体例子来说明递归算法的应用。
算法原理1.递归定义:递归算法通过将问题分解为规模更小的子问题来解决。
通常,递归算法会有一个或多个基准情况,当问题的规模达到基准情况时,递归调用将停止。
2.递归调用:在递归算法中,函数会调用自身来解决规模更小的子问题。
通过递归调用,问题的规模逐步缩小,直到达到基准情况。
3.递归终止条件:递归算法必须定义一个或多个递归终止条件,当满足这些条件时,递归调用将停止。
实验步骤为了更好地理解递归算法的应用,我们选取了斐波那契数列作为示例,并通过递归算法计算斐波那契数列的第n项。
1.确定递归终止条件:斐波那契数列的第0项和第1项为预定义的基准情况,所以递归终止条件为n=0或n=1。
2.实现递归算法:创建一个递归函数fibonacci(n),用于计算斐波那契数列的第n项。
3.处理递归调用:在递归函数中,当n大于1时,调用fibonacci(n-1)和fibonacci(n-2)来计算第n-1项和第n-2项,并将它们相加得到第n项的值。
4.返回计算结果:将计算得到的结果返回给调用者。
实验结果通过上述步骤,我们成功实现了递归算法来计算斐波那契数列的第n项。
以下是一些示例结果:•当n=0时,第0项为0。
•当n=1时,第1项为1。
•当n=2时,第2项为1。
•当n=3时,第3项为2。
•当n=4时,第4项为3。
我们还可以通过增大n的值来计算更多项的斐波那契数列。
实验总结通过本次实验,我们深入了解了递归算法的原理和应用。
递归算法通过将问题分解为更小的子问题,从而解决复杂的计算任务。
然而,递归算法也存在一些缺点,如效率较低和可能出现栈溢出的风险。
因此,在实际应用中需要谨慎使用递归算法,并针对具体问题选择合适的算法思想。
希望通过本次实验,读者对递归算法有了更深入的理解,并能够灵活运用递归算法解决实际问题。
循环与递归
递归的关键在于找出递归方程 式和递归终止条件。 式和递归终止条件。
递归定义: 递归定义:使问题向边界条件转化 的规则。 的规则。递归定义必须能使问题 越来越简单。 越来越简单。 递归边界条件: 递归边界条件:也就是所描述问题 的最简单情况, 的最简单情况,它本身不再使用 递归的定义。 递归的定义。
“自顶向下”的设计方法 自顶向下” 【 例 2】 编算法找出 1000 以内所有 编算法找出1000 1000以内所有 完数 例如,28的因子为 的因子为1 14, 例如,28的因子为1、2、4、7,14, 28= 而 28=1+2+4+7+14 。 因 此 28 是 完数” 编算法找出1000 1000之内 “ 完数 ” 。 编算法找出 1000 之内 的所有完数, 的所有完数 , 并按下面格式输出 其因子: 其因子:28
Hanoi塔问题 Hanoi塔问题 void hanoi(int n, int a, int b, int c) { if (n > 0) 当n=1时,问题比较简单。此时,只要将编号为1的圆盘从塔座a直 在问题规模较大时,较难找到一般的方法,因此我们尝试 { 接移至塔座b上即可。 用递归技术来解决这个问题。 hanoi(n-1, a, c, b); 当n>1时,需要利用塔座c作为辅助塔座。此时若能设法将n-1个 较小的圆盘依照移动规则从塔座a移至塔座c,然后,将剩下的最 move(a,b); 大圆盘从塔座a移至塔座b,最后,再设法将n-1个较小的圆盘依照 hanoi(n-1, 移动规则从塔座c移至塔座b。 c, b, a); } 由此可见,n个圆盘的移动问题可分为2次n-1个圆盘的移动问题, } 这又可以递归地用上述方法来做。由此可以设计出解Hanoi塔问题 的递归算法如下。
递归算法的实验报告
一、实验背景递归算法是计算机科学中一种重要的算法设计方法,它通过将复杂问题分解为若干个规模更小的相同问题来求解。
递归算法在处理某些问题时具有简洁、直观和高效的优点。
本实验旨在通过实践和探索,深入理解递归算法的设计与实现,并分析其优缺点。
二、实验目的1. 理解递归算法的基本概念和原理。
2. 掌握递归算法的设计方法。
3. 分析递归算法的优缺点。
4. 通过具体实例,实践递归算法的编程实现。
三、实验内容本实验选择了两个具有代表性的递归算法进行实践:汉诺塔问题和斐波那契数列问题。
1. 汉诺塔问题汉诺塔问题是一个经典的递归问题,描述了三个柱子和n个大小不同的盘子,初始时盘子按从小到大的顺序放在第一个柱子上,目标是将所有盘子移动到第三个柱子上,每次只能移动一个盘子,且在移动过程中,大盘子不能放在小盘子上面。
实验步骤:(1)定义递归函数`move(n, source, target, auxiliary)`,其中n表示盘子数量,source表示起始柱子,target表示目标柱子,auxiliary表示辅助柱子。
(2)当n=1时,直接将盘子从source移动到target。
(3)当n>1时,首先将前n-1个盘子从source移动到auxiliary,然后将第n个盘子从source移动到target,最后将前n-1个盘子从auxiliary移动到target。
代码实现:```pythondef move(n, source, target, auxiliary):if n == 1:print(f"Move disk 1 from {source} to {target}")returnmove(n-1, source, auxiliary, target)print(f"Move disk {n} from {source} to {target}")move(n-1, auxiliary, target, source)```2. 斐波那契数列问题斐波那契数列是一个著名的数列,其中每个数都是前两个数的和。
一步一步写算法(之循环和递归)
软件英才网软件行业驰名招聘网站一步一步写算法(之循环和递归)其实编程的朋友知道,不管学什么语言,循环和递归是两个必须学习的内容。
当然,如果循环还好理解一点,那么递归却没有那么简单。
我们曾经对递归讳莫如深,但是我想告诉大家的是,递归其实没有那么可怕。
所谓的递归就是函数自己调用自己而已,循环本质上也是一种递归。
1)求和递归函数我们可以举一个循环的例子,前面我们说过,如果编写一个1到n的求和函数怎么写呢,你可能会这么写:1int calculate(int m)2{3int count = 0;4if(m <0)5return -1;67for(int index = 0; index <= m; index++)8 count += index;910return count;11}12int calculate(int m)13{14if(m == 0)15return 0;16else17return calculate(m -1) + m;18}大家看着两段代码有什么不同?(1)第一段代码从0,开始计算,从0到m逐步计算;第二段代码是从10开始计算,逐步到0之后这回,这样同样可以达到计算的效果(2)第一段代码不需要重复的压栈操作,第二段需要重复的函数操作,当然这也是递归的本质(3)第一段代码比较长,第二段代码较短软件英才网软件行业驰名招聘网站2)查找递归函数大家可能说,这些代码有些特殊。
如果是查找类的函数,有没有可能修改成递归函数呢?19int find(int array[], int length, int value)20{21int index = 0;22if(NULL == array || 0 == length)23return -1;2425for(; index < length; index++)26 {27if(value == array[index])28return index;29 }3031return -1;32}大家可能说,这样的代码可能修改成这样的代码:33int _find(int index, int array[], int length, int value)34{35if(index == length)36return -1;3738if(value == array[index])39return index;4041return _find(index + 1, array, length, value);42}4344int find(int array[], int length, int value)45{46if(NULL == array || length == 0)47return -1;4849return _find(0, array, length, value);50}3)指针变量遍历结构指针是我们喜欢的遍历结构,试想如果有下面定义的数据软件英才网软件行业驰名招聘网站结构:51typedef struct _NODE52{53int data;54struct _NODE* next;55}NODE;56void print(const NODE* pNode)57{58if(NULL == pNode)59return;6061while(pNode){62 printf("%d\n", pNode->data);63 pNode = pNode->next;64 }65}66void print(const NODE* pNode)67{68if(NULL == pNode)69return;70else71 printf("%d\n", pNode->data);7273 print(pNode->next);74}其实,写这么多,就是想和大家分享一下我个人的观点:循环是一种特殊的递归,只有递归和堆栈是等价的。
算法设计与分析第三章循环与递归详解演示文稿
/*minj代表当前行中最小值的列下标;设置标志量kz*/
readmtr(a,n);
prntmtr(a,n);
for(i=0;i<n;i++)
{t=a[i][0]; minj=1;
for(j=1;j<n;j++)
if(a[i][j]<t) {t=a[i][j];minj=j;} for(k=0;k<n;k++)
if(a[i][j]<t) {
t=a[i][j];
minj=j; }
第18页,共50页。
3)检验t是否第minj列的最大值,是,则输出鞍点;
for(k=0;k<n;k=k+1) if(a[k][minj]>t) break;
if(k<n) continue; print(“the result is a[“,i ,“][” ,minj, “]=”, t);
基于以上数据变化规律,以层号作为外层循环,循环变量为i(范围为1— —n);以层内元素从左上到右下的序号作为内循环,循环变量为j(范围为 1——n+1-i)。这样循环的执行过程正好与“摆放”自然数的顺序相同。用 一个变量k模拟要“摆放”的数据,下面的问题就是怎么样将数据存储到对应 的数组元素。
第22页,共50页。
数组元素的存取,只能是按行、列号操作的。所以下面用由具体到抽 象设计循环的“归纳法”,找出数组元素的行号、列号与层号i及层内序号 j的关系:
1.每层内元素的列号都与其所在层内的序号j是相同的。因为每层的序号是从 第一列开始向右下进行。
2.元素的行与其所在的层号及在层内的序号均有关系,具体地: 第一层行号1——n,行号与j同;
分别用for、while和do-while循环语句以及递归方法计算n!,并输出算式
分别用 for、 while和 do-while循环语句以及递归方法计算 n!,并 输出算式
1.用for语句实现,代码与计算结果如下:
2.用while语句实现,代码与结果如下 3.用do while 语句实现,代码及结果如下
4.用递归语句实现,实验代码及结果如下 实验心得: 1.由于没有讲如何在键盘上手动输入一个值,所以在网上找到了Scanner.in 的用法 2.在实验过程中一个小小的粗心都会导致错误,浪费时间去检查 3.四个实验可以合并为一个大的程序,这里为了方便理解,就一个一个分开了 4.语句的先后实验不
递归与递归实验报告
递归与递归实验报告引言递归是计算机科学中一种重要的概念,它在问题拆解和解决复杂计算的过程中发挥着重要作用。
本实验将围绕递归展开,通过一些实例来探讨递归的工作原理以及在实际应用中的效果。
理论基础什么是递归?递归是指在解决问题时调用自身的一种编程技巧。
递归算法通常包含两部分:基准情况(递归停止条件)和递归情况(问题规模不断减小的循环调用)。
递归与循环的区别递归和循环都可以用于解决迭代问题,但它们之间有一些重要的区别。
递归是一种函数或子程序调用自身的技术,而循环则是通过迭代方式重复执行一段代码。
递归通常更容易理解和实现,但在一些情况下可能会造成性能上的问题。
递归实现原理递归实现的思想是将一个大问题划分为多个相同或类似的子问题,然后通过逐步解决子问题来解决整个问题。
实验过程实验一:阶乘函数pythondef factorial(n):if n == 0:return 1else:return n * factorial(n-1)阶乘函数是递归的典型例子。
在该实验中,我们定义了一个计算阶乘的函数。
当输入为0时,返回1;否则,返回n与factorial(n-1)的乘积。
实验二:斐波那契数列pythondef fibonacci(n):if n <= 0:return 0elif n == 1:return 1else:return fibonacci(n-1) + fibonacci(n-2)斐波那契数列也是递归的典型例子。
在该实验中,我们定义了一个计算斐波那契数的函数。
当输入为0时,返回0;当输入为1时,返回1;否则,通过递归调用fibonacci(n-1)和fibonacci(n-2)来计算结果。
实验三:汉诺塔问题pythondef hanoi(n, source, target, auxiliary):if n > 0:hanoi(n-1, source, auxiliary, target)print(f"Move disk {n} from {source} to {target}")hanoi(n-1, auxiliary, target, source)汉诺塔问题是一个经典的递归问题。
脚本编程-实验一 杨辉三角的递归和循环的实现
Javascript实验报告——杨辉三角的递归和循环实现课程名称:脚本编程技术实验日期:2015-09-16仪器编号:班级:姓名:学号:实验一杨辉三角的递归和循环实现一、实验目的1、深入掌握Javascript的自定义函数和基本的流程控制语句;2、掌握Javascript中递归函数调用和循环体的逻辑结构;3、掌握和熟悉利用Dreamweaver实现Javascript功能函数和简单的页面输出。
二、实验要求1、分别通过递归函数以及循环的方式实现输出杨辉三角;2、保证代码的中间结果与最终显示结果正确;3、编辑程序说明文档。
三、实验步骤附实验代码及说明文档<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN""/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>杨辉三角的递归和循环实现</title></head><body><h3>杨辉三角的递归和循环实现</h3><script language="javascript">var line=10,i,j;var mynumberss=new Array();//输入标题document.writeln(line+"行的杨辉三角如下:<br>");//建立数组for(i=0;i<line;i++){mynumberss[i]=new Array();}//计算输出for(i=0;i<line;i++){for(j=0;j<=i;j++){if(i==j||j==0){mynumberss[i][j]=1;}else{mynumberss[i][j]=mynumberss[i-1][j]+mynumberss[i-1][j-1];}document.write(mynumberss[i][j]+" ");if(i==j)document.write("<br>");}}</script></body></html>四、实验体会记录实验过程中碰到的问题及解决方法、最终实验结果。
循环与递归实验总结
循环与递归实验总结《循环与递归实验总结:一场奇妙的代码之旅》嘿,大家好啊!今天我要来讲讲我在循环与递归实验中的那些事儿,可真是一场奇妙的代码之旅呀!刚开始接触循环的时候,我就觉得这玩意儿有点像在跑步机上跑步,一直跑啊跑,周而复始。
不过呢,你得把握好节奏,不然就容易跑偏或者累趴下。
我记得最开始写循环代码的时候,那真是状况百出,一会儿忘了设置终止条件,结果程序就跟发疯了似的跑个不停;一会儿又把循环变量搞错了,搞得我是哭笑不得。
后来慢慢掌握了循环的技巧,就感觉自己像是掌握了一门绝世武功。
不管是要计算个总数,还是遍历个列表啥的,那都是信手拈来。
不过可别小瞧了循环,有时候一个小小的失误就能让你的程序从良驹变成瘸马,那可就尴尬咯!再来说说递归,这玩意儿就更有意思了,就像是一个会分身术的大师。
自己调用自己,一层一层地深入,真的是让人又爱又恨。
爱它呢,是因为用好了递归,一些复杂的问题能变得超级简洁明了,那代码写出来,简直美如画。
恨它呢,是因为如果没搞清楚递归的边界和逻辑,那你的程序可能就会陷入死循环,就像进入了一个无尽的迷宫,半天也出不来。
记得有一次做一个关于树结构的递归实验,我是绞尽脑汁,感觉头发都掉了好几根。
一会儿调用层次太深了,爆栈了;一会儿又在递归过程中把数据给弄丢了。
那感觉,就像是跟一个调皮的小精灵在打交道,你得时刻关注着它,稍不注意就被它给捉弄了。
不过,经过多次的摸爬滚打,我也算是慢慢驯服了循环和递归这两个小家伙。
现在看到它们,就像看到老朋友一样亲切。
虽然有时候还是会被它们搞得有点头疼,但更多的是享受那种解开难题后的成就感。
总的来说,循环与递归的实验就像是一场代码的冒险。
有欢笑,有泪水,有惊喜,也有挫折。
但正是这些经历让我不断成长,让我对编程有了更深的理解和热爱。
所以啊,各位小伙伴们,如果你们也在循环与递归的世界里遨游,可别害怕,勇敢地去探索吧!也许下一个代码大师就是你哟!加油吧!。
递归算法实验
实验课程:算法分析与设计实验名称:实验一C/C++环境及递归算法(综合性/设计性)实验目标:1、熟悉C/C++语言的集成开发环境;2、通过本实验加深对递归过程的理解。
实验任务:掌握递归算法的概念和基本思想,分析并掌握排列问题的递归算法和Hanoi塔问题的递归算法。
实验题:1、设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。
任意输入一串整数或字符,输出结果能够用递归方法实现整数或字符的全排列。
2、设a,b,c是3个塔座。
开始时,在塔座a上有一叠共n个圆盘,这些圆盘自下而上,由大到小地叠在一起。
各圆盘从小到大编号为1,2,…,n,现要求将塔座a上的这一叠圆盘移到塔座b上,并仍按同样顺序叠置。
实验设备及环境:PC;C/C++的编程环境Visual C++。
实验主要步骤:(1)明确实验目标和具体任务;(2)理解实验所涉及的分治算法;(3)编写程序并实现分治算法;(4)设计实验数据并运行程序、记录运行的结果;实验数据及运行结果、实验结果分析及结论:1、#include <iostream.h>inline void swap(int &a,int &b){int temp=a;a=b;b=temp;}void perm(int list[],int k,int m){if(k==m){for(int i=0;i<=m;i++)cout<<list[i];cout<<endl;}elsefor(int i=k;i<=m;i++){swap(list[k],list[i]);perm(list,k+1,m);swap(list[k],list[i]);}}void main(){int list[5]={1,2,3,4,5};perm(list,1,3);}实验结果:结果分析:数据为1,2,3,4,5,是以1开头,后面四位做全排列,所要排序的是2、3、4、5,那么共有4*3*2*1=24种结果,因而可知程序执行是正确的。
递归算法的实验报告
递归算法的实验报告递归算法的实验报告引言:递归算法作为一种重要的问题解决方法,在计算机科学领域发挥着重要的作用。
本次实验旨在通过实际编程实现递归算法,并对其性能进行评估和分析,以探讨递归算法的优势和局限性。
一、递归算法的基本原理递归算法是一种将问题分解为更小规模的子问题来解决的方法。
其基本原理是在解决一个问题的过程中,调用自身来解决更小规模的相同问题,直到达到基本情况,然后将结果合并得到最终解。
递归算法的核心是找到递归的边界条件和递推关系。
二、实验设计与实现本次实验选择了经典的递归问题——计算斐波那契数列。
斐波那契数列是一个典型的递归问题,其定义如下:F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2) (n >= 2)。
为了实现递归算法,我们设计了一个名为fibonacci的函数。
该函数接受一个整数n作为输入,返回斐波那契数列的第n个元素。
函数的实现如下:```pythondef fibonacci(n):if n == 0:return 0elif n == 1:return 1else:return fibonacci(n-1) + fibonacci(n-2)```三、实验结果与分析我们首先对fibonacci函数进行了功能测试,通过计算前几个斐波那契数列的元素来验证函数的正确性。
实验结果表明,函数能够正确计算出斐波那契数列的元素。
接下来,我们对递归算法的性能进行了评估。
我们分别计算了斐波那契数列的前30个元素,并记录了每次计算所花费的时间。
实验结果显示,随着n的增大,递归算法的计算时间呈指数级增长。
这是因为递归算法在计算过程中会重复计算相同的子问题,导致计算量呈指数级增加。
因此,在处理大规模问题时,递归算法的效率较低。
为了进一步验证递归算法的性能,我们将fibonacci函数与迭代算法进行了比较。
迭代算法是一种通过循环来解决问题的方法,相比递归算法,迭代算法不会出现重复计算的情况。
for循环里面的函数递归执行问题
for循环里面的函数递归执行问题
今天在编写程序时,遇到了一个问题,就是在 for 循环里面调用递归函数时出现了意料之外的结果。
具体来说,我在循环中调用了一个递归函数,但是函数并没有如预期那样递归执行,而是在执行到某一次时直接跳出了循环。
经过一番思考和调试,我发现这是因为在递归函数中使用了 for 循环。
由于 for 循环中的计数器是共享的,所以在递归函数中调用for 循环时,循环计数器的值也会被修改,从而影响到循环的执行。
具体来说,当递归函数执行到某一层时,会改变循环计数器的值,导致循环执行到一半时退出。
为了避免这个问题,可以使用一个局部变量来保存循环计数器的值,然后在递归函数中调用时传递这个变量,从而避免循环计数器被修改的问题。
总之,当在 for 循环中调用递归函数时,要注意循环计数器的值可能会被修改,要采取相应的措施来避免这个问题。
- 1 -。
分别设计循环算法和递归算法
分别设计循环算法和递归算法一、循环算法:循环算法是一种基于循环结构的算法,通过迭代完成算法执行的过程。
它利用循环体内的代码重复执行,控制流程按照一定的条件进行循环,直到达到预期结果为止。
以下是循环算法的一些常见应用:1.计算数字的阶乘:阶乘是指从1到一个数之间各个数字相乘的结果,比如5的阶乘就是1*2*3*4*5=120。
以下是计算阶乘的循环算法:int factorial(int n) {if(n <= 1)return 1;int result = 1;for(int i = 2; i <= n; i++) {result *= i;}return result;}2.查找数组中的最大值:数组是一组相同数据类型的有序集合,可以使用循环来查找数组中的最大值。
以下是查找数组最大值的循环算法:int max_num(int nums[], int n) {int max = nums[0];for(int i = 1; i < n; i++) {if(nums[i] > max) {max = nums[i];}}return max;}3.实现斐波那契数列:斐波那契数列是指有一列数列,其中每一个数字都是前两个数字的和。
以下是实现斐波那契数列的循环算法:int fibonacci(int n) {if(n <= 1)return n;int a = 0, b = 1, c;for(int i = 2; i <= n; i++) {c = a + b;a = b;b = c;}return b;}二、递归算法:递归算法是通过调用自身来解决问题的一种算法。
它把一个大问题分解为更小的子问题,然后逐个解决子问题,最终得到整个问题的解决方案。
以下是递归算法的一些常见应用:1.计算数字的阶乘:与前面介绍的循环算法不同,递归算法是通过不断调用自身实现计算阶乘的。
以下是递归算法的实现方式:int factorial(int n) {if(n <= 1) {return 1;}return n * factorial(n - 1);}2.计算斐波那契数列:同样的,递归算法也可以实现斐波那契数列的计算。
测试递归与循环(这里用for)的执行效率与系统开销
测试递归与循环(这⾥⽤for)的执⾏效率与系统开销测试递归与循环(这⾥⽤for)的执⾏效率与系统开销,⾸先贴出实例问题:实现Fibonacci数列F(n)=F(n-1)+ F(n-2)测试环境 Eclipse1.⾸先我们⽤递归来实现1package com.youfeng.test;23public class Fab {//递归4public static void main(String [] args){5 System.out.println(F(40));6 }7public static Long F(int index){8if(index==1||index==2){9return 1L;10 }11else{12return F(index-1)+F(index-2);13 }14 }15 }2.⽤for循环实现package com.youfeng.test;public class Fab2 {//循环public static void main(String [] args){System.out.println(F(40));}public static Long F(int index){if(index==1||index==2){return 1L;}else{Long f1=1L;Long f2=1L;Long f=0L;for(int i=0;i<index;i++){f1=f2;f2=f;f=f1+f2;}return f;}}}当index的值很⼩的时候,我们分别执⾏没什么区别,执⾏速度我们感觉不到什么差别,但是当你把index调到⾜够⼤时100 、200、300、1000…… for循环轻松搞定执⾏速度挺快当使⽤递归时,你会发现明显的卡机卡机,有⽊有?调⽤系统资源管理器看看你的系统开销吧(很可能你你打不开资源管理器,因为你卡机了)总结:能不使⽤递归,尽量不要使⽤,尽量使⽤循环,效率蛮⾼的;⼀家之⾔,欢迎拍砖,实验简陋,很多因素没有考虑进来,请⾼⼿指点。
循环与递归算法实验
循环与递归算法实验目录实验一循环与递归算法的应用.................................. - 2 -一、实验目的............................................... - 2 -二、实验内容............................................... - 2 -三、实验步骤............................................... - 3 -四.程序调试及运行结果分析.................................. - 5 -五.实验总结................................................ - 5 -附录:程序清单(程序过长,可附主要部分).................. - 6 - 实验一循环与递归算法的应用一、实验目的1.掌握循环、递归算法的基本思想、技巧和效率分析方法。
2.熟练掌握循环和递归的设计要点,清楚循环和递归的异同。
3.学会利用循环、递归算法解决实际问题。
二、实验内容1.问题描述:题目一:打印图形编写程序:根据参数n打印具有下面规律的图形,如,当n=4时,图形如下:15 28 6 310 9 7 4题目二:回文判断判断s字符串是否为“回文”的递归程序。
题目三:计算前n项和根据参数n,计算1+2+……+n。
要求:用循环和递归分别实现2.数据输入:个人设定,由键盘输入。
3.要求:1)上述题目中学号为单数的做题目一和三,双数做二和三。
上机前,完成程序代码的编写2)独立完成实验及实验报告三、实验步骤1.理解算法思想和问题要求;2.编程实现题目要求;3.上机输入和调试自己所编的程序;4.验证分析实验结果;5.整理出实验报告。
附:实验报告的主要内容一.实验目的二.问题描述三.算法设计解答第二题,思路为设计一个递归函数,并定义三个参数字符数组s[100]、整型变量len和i。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
目录
实验一循环与递归算法的应用.................................. - 2 -
一、实验目的............................................... - 2 -
二、实验内容............................................... - 2 -
三、实验步骤............................................... - 3 -
四.程序调试及运行结果分析.................................. - 5 -
五.实验总结................................................ - 5 -
附录:程序清单(程序过长,可附主要部分).................. - 6 -
实验一循环与递归算法的应用
一、实验目的
1.掌握循环、递归算法的基本思想、技巧和效率分析方法。
2.熟练掌握循环和递归的设计要点,清楚循环和递归的异同。
3.学会利用循环、递归算法解决实际问题。
二、实验内容
1.问题描述:
题目一:打印图形
编写程序:根据参数n打印具有下面规律的图形,
如,当n=4时,图形如下:
1
5 2
8 6 3
10 9 7 4
题目二:回文判断
判断s字符串是否为“回文”的递归程序。
题目三:计算前n项和
根据参数n,计算1+2+……+n。
要求:用循环和递归分别实现
2.数据输入:个人设定,由键盘输入。
3.要求:
1)上述题目中学号为单数的做题目一和三,双数做二和三。
上机前,完成程序代码的编写
2)独立完成实验及实验报告
三、实验步骤
1.理解算法思想和问题要求;
2.编程实现题目要求;
3.上机输入和调试自己所编的程序;
4.验证分析实验结果;
5.整理出实验报告。
附:实验报告的主要内容
一.实验目的
二.问题描述
三.算法设计
解答第二题,思路为设计一个递归函数,并定义三个参数字符数组s[100]、整型变量len和i。
在函数中利用条件语句判断第一个和最后一个字符是否相同,依次往下进行比较判断,如果是回文数返回1,不是则返回0。
并在主函数中利用条件语句将0、1转化为自然语言。
图2.1 程序运行流程图
第三题计算1到n的数值总和,用循环算法需要设计一层循环,将语句sum+=i;计算n次累加得出结果。
但是循环算法相比在时间效率上不如递归算法。
所以,可以用递归算法计算较为简单,以n=1为终止条件,多次调用自身即可得出答案。
fact(n)→fact(n-1)……fact(2) →fact(1)
递归回溯
图3.1 递归算法示意图
四.程序调试及运行结果分析
1)运行程序后,输入asdfghgfdsa 进行判断,运行成功是回文数则返回1值转
化为自然语言输出:是回文数。
图2.2 判断回文数
2)运行程序后,输入n的数值为100由计算机计算1到100的数字相加之和,
运行成功则输出正确结果。
图3.2 计算总和
五.实验总结
这次实验的两道题都用到了递归,递归算法虽然是我们以前已经学过的内容,但是通过这次实验我真正用起来的时候,才发现真的不知从何下手。
后来通过书上和老师上课讲解的例题发现,递归算法设计的关键找出递归关系和递归终止条件。
递归关系就是使问题向边界条件转化的规则。
比如第二题利用条件语句判断第一个和最后一个字符是否相同,依次往下进行比较判断,如果是回文数返回1,不是则返回0。
第三题终止条件就是n是否等于1,结束时返回结果。
这次实验也使我掌握了构造递归算法的方法技巧,使我更加深入的了解掌握了递归算法,收获较大。
附录:程序清单(程序过长,可附主要部分)第二题程序如下:
#include <iostream.h>
#include <string.h>
int huiwen(char s[100],int len,int i)
{
if(i>(len-1)/2)
{
if(s[i]==s[len-1-i])
return 1;
else
return 0;
}
else
{
if(s[i]==s[len-1-i])
return huiwen(s,len,i+1);//如果满足回文条件才递归else
return 0;
}
}
int main()
{
char s[100];
int len;
int n;
cin>>s;
len=strlen(s);
n=huiwen(s,len,0);
if(n==1)
cout<<"是回文数"<<endl;
else
cout<<"不是回文数"<<endl;
return 0;
}
第三题程序如下:
循环:
#include<iostream>
using namespace std;
int main()
{
int n,i,sum=0;
cin>>n;
for(i=1;i<=n;i++)
sum+=i;
cout<<"结果是:"<<sum<<endl;
return 0;
}
递归:
#include<iostream>
using namespace std;
int fact(int n);
int main()
{
int n,c;
cin>>n;
c=fact(n);
cout<<"结果是:"<<c<<endl;
return 0;
}
int fact(int n)
{
if(n==1)
return(1);
else
return(n+fact(n-1)); }。