循环与递归算法实验
实验一 循环与递归

实验一循环与递归一、实验目的进一步理解循环与递归程序设计的基本思想,充分利用基本的机械化操作设计高质量的算法。
二、实验要求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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 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)); }。