C++实验8.9.10.doc

上传人:hs****ma 文档编号:564355810 上传时间:2023-07-22 格式:DOC 页数:24 大小:407.51KB
返回 下载 相关 举报
C++实验8.9.10.doc_第1页
第1页 / 共24页
C++实验8.9.10.doc_第2页
第2页 / 共24页
C++实验8.9.10.doc_第3页
第3页 / 共24页
C++实验8.9.10.doc_第4页
第4页 / 共24页
C++实验8.9.10.doc_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《C++实验8.9.10.doc》由会员分享,可在线阅读,更多相关《C++实验8.9.10.doc(24页珍藏版)》请在金锄头文库上搜索。

1、实验八 函数的递归算法1.范例:求组合数,一、实验目的1. 学会解决简单的递归算法。2. 掌握函数的嵌套调用。二、实验内容1. 函数嵌套调用是在被调用的函数内再调用其它函数,而递归调用是在被调函数内调用自身。嵌套调用的层数没有限制,而递归调用函数必须包含使递归终止的语句。2.求组合数要用到求阶乘,可将求阶乘定义为一个函数,在求组合数的函数中嵌套调用阶乘函数。由于n!=n*(n-1)!,求阶乘是一个典型的递归算法,在此用递归方法实现。三、伪码表述算法:1.输入整数变量m、n,long com(int i,int j)long cmb; cmb= fac(j)/(fac(i)*fac(j-i);

2、return cmb;long fac(int i)long fcl; if(i=0|i=1) fcl =1; else fcl = i*fac(i-1); return fcl;2.输出结果四、源程序#include using namespace std;long com(int ,int), fac(int); int main()int m,n;coutPlease input two numbers m,n(mmn; if(m=n)coutC(m,n)=com(m,n)endl;else coutInput Error!n;return 0;long com(int i,int j)

3、long cmb; cmb= fac(j)/(fac(i)*fac(j-i); return cmb;long fac(int i)long fcl; if(i=0|i=1) fcl =1; else fcl = i*fac(i-1); return fcl;五、输出结果输入1和2,其程序运行结果:输入3和1,其程序运行结果:这里因阶乘极易溢出,n最大取12,否则运算中会发生溢出。六、分析: 在函数内定义局部变量时,变量名不应与函数名相同,例如,在A行,不可定义变量名为com,在B处,不可为fac;还有一种常见错误如下:long fac(int i)if(i=0|i=1) fac(i) =1;

4、 else fac(i) = i*fac(i-1); return fac(i);编译这样的程序,会出现”Left_value required”的错误,这是因为fac(i)是一个函数,本身已有定义,后面会有求值,而不是赋予给它一个值。应改为:long fac(int i)long fcl;if(i=0|i=1) fcl =1; else fcl = i*fac(i-1); return fcl; 2.用两种方法求两个数的最大公约数,最小公倍数 一、实验目的1、学会用递推算法和递归算法两种方法求最大公约数。2、学会利用递推和递归算法进行简单编程。二、实验内容用欧几里德算法计算两个数的最大公约数

5、,分别用递推(while循环实现)和递归两种方法实现。并计算两个数的最小公倍数。三、伪码表述 算法:1、定义变量a,b为两个任意的正整数,c为这两个数的最小公倍数。 2、int a,b,c; while(a%c!=0) b=a; a=c; c=b-a; 3、输出结果c。四、源程序1.用递推法#includeusing namespace std;int fac(int a,int b)int c,d;c=b-a;d=a*b/c;if(a%c=0) return c;else fac(c,a);int main()int a,b,c,d;cout请输入两个整数a,b:ab;c=fac(a,b);

6、d=a*b/fac(a,b);cout最大公约数为:cendl;cout最小公倍数为:dendl;return 0;2.用递归法:#includeusing namespace std;int fac(int a,int b)int c,d;c=b-a;d=a*b/c;if(a%c=0) return c;else fac(c,a);int main()int a,b,c,d;cout请输入两个整数a,b:ab;c=fac(a,b);d=a*b/fac(a,b);cout最大公约数为:cendl;cout最小公倍数为:dendl;return 0; 五、输出结果(1)分别输入数据 ,编译运行程

7、序,并记录程序结果。 输入结果a=1 b=2c=1 d=2 a=5 b=6 c=1 d=30 (2)结果如下: 3.修改题1,使其不易溢出。 一、实验目的1.掌握递归算法和函数的嵌套调用的使用。2.学会修改函数,使其组合元素变量不易溢出。 二、实验内容 考虑到: =(n*(n-1)*(n-m+1)/m! =(n/1)*(n-1)/2* *(n-(m-2)/(m-1)* (n-(m-1)/m= Cm-1n*(n-(m-1)/m可以用递归的方法计算,这里n可以用到40。 三、伪码表述算法:1、设置变量m、n用来放组合数的元素和整体,定义com(m、n)为组合数,fac为阶乘函数,其中m,n为整数变

8、量。2、输入整数变量m、n,long com(int m,int n) if(m=1) return n; else return com(m-1,n)/m*(n-(m-1); 3、输出结果 四、源程序#include using namespace std; long com(int,int); int main() int m,n; coutPlease input two numbers m,n(mmn; if(m=n) coutC(m,n)=com(m,n)endl; else coutInput Error!n; return 0; long com(int m,int n) if(

9、m=1) return n; else return com(m-1,n)/m*(n-(m-1); 五、输出结果(1)分别输入数据 ,编译运行程序,并记录程序结果。 输入结果m=15 n=20=15378 m=20 n=12 Error (2)结果如下:实验九 函数的重载和变量的作用域1、编写几个计算面积的函数一、实验目的了解内联函数的定义及使用。二、实验内容1. 重载函数允许不同的函数使用相同的名字,这使得完成类似任务时可以使用相同函数名。2.编写几个计算面积的函数,分别计算圆、矩形、梯形和三角形的面积,计算边长为1的正方形及其内切圆、内接等腰三角形和等腰梯形面积。函数原型如下:double

10、 area(double radius=0); /圆面积,参数为半径,默认参数0,表示点面积double area(double a, double b); /计算矩形面积,参数为长和宽double area(double a, double b, double h); /计算梯形面积,参数为两底和高double area(double a, double b, double c, int);/三角形,参数为三边长,int型参数起标示作用,以区别于梯形,不参加计算三、伪码表述算法:1.定义PI值,说明各函数与参数类型。 2.double area(double radius)return PI

11、*radius*radius;double area(double a, double b)return a*b;double area(double a, double b, double h)return (0.5*(a+b)*h);double area(double a, double b, double c, int)double s=0.5*(a+b+c);return sqrt(s*(s-a)*(s-b)*(s-c); 3.输出结果。四、源程序#include#includeusing namespace std;#define PI 3.14159double area(dou

12、ble radius=0);double area(double a, double b); double area(double a, double b, double h);double area(double a, double b, double c, int);int main() coutArea of point isarea( )n;coutArea of square isarea(1,1)n;coutArea of circle isarea(0.5)n;coutArea of trapezium isarea(1,0.5,1)n;coutArea of triangle isarea(1,sqrt(1+0.5*0.5),sqrt(1+0.5*0.5),0)n;return 0;double area(double radius)return PI*radius*radius;double area(double a, double b)return a*b;double area(double a, double

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 科普知识

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号