当前位置:文档之家› c++,使用欧几里得算法计算两个数的最大公约数,分别用递推和递归两种算法实现5

c++,使用欧几里得算法计算两个数的最大公约数,分别用递推和递归两种算法实现5

实验九
一、实验内容
教材3.9 定义递归函数实现下面的Ackman函数
n+1 m=0
Acm(m,n)= Acm(m-1,1) n=0
Acm(m-1,Acm(m,n-1)) n>0,m>0
教材3.10 用递归法实现勒让德多项式:
1 n=0
Pn= x n=1
((2n-1)xPn-1(x)-(n-1)Pn-2(x))/n
教程p24 使用欧几里得算法计算两个数的最大公约数,分别用递推和递归两种算法实现
教程p26 编程:将上题以多文件方式组织,在area.h中声明各个area()函数原型,在area.cpp文件中定义函数,然后在Exp9_2中包含area.h,定义main()
函数并执行。

二、实验目的
1、掌握函数的嵌套调用好递归调用
2、掌握递归算法
3、了解内联函数、重载函数、带默认参函数的定义及使用方法
4、掌握程序的多文件组织
5、掌握编译预处理的内容,理解带参数宏定义与函数的区别
三、实验步骤
教材3.9 定义递归函数实现下面的Ackman函数
n+1 m=0
Acm(m,n)= Acm(m-1,1) n=0
Acm(m-1,Acm(m,n-1)) n>0,m>0
教材3.10用递归法实现勒让德多项式:
1 n=0
Pn= x n=1
((2n-1)xPn-1(x)-(n-1)Pn-2(x))/n
教程p24 使用欧几里得算法计算两个数的最大公约数,分别用递推和递归两种算法实现
教程p26 编程:将上题以多文件方式组织,在area.h中声明各个area()函数原型,在area.cpp文件中定义函数,然后在Exp9_2中包含area.h,定义main()
函数并执行。

四、实验数据及处理结果
#include<iostream>
using namespace std;
int Acm(int m,int n){
if(m==0) return n+1;
else{
if(n==0) return Acm(m-1,1);
else return Acm(m-1,Acm(m,n-1));
}
int main(){
int a,b;
cout<<"please imput two numbers:"<<endl;
cin>>a>>b;
cout<<"Acm(a,b)="<<Acm(a,b)<<endl;
return 0;
}
教材3.10
#include<iostream>
using namespace std;
double P(int n,double x){
if(n==0) return 1;
if(n==1) return x;
return ((2*n-1)*x*P(n-1,x)-(n-1)*P(n-2,x))/n;
}
int main(){
cout<<"P(4,1.5)="<<P(4,1.5)<<endl;
}
教程p24
实验八(2)递推法
#include<iostream>
using namespace std;
int max(int x,int y){
return(x>=y?x:y);
}
int min(int a,int b){
return(a<=b?a:b);
}
int main(){
int a,b,c,d,n;
cout<<"Please imput tow numbers"<<endl;
cin>>a>>b;
c=max(a,b);
d=min(a,b);
n=c%d;
while(n!=0){
c=d;
d=n;
n=c%d;
}
cout<<"最大公约数是"<<d<<endl;
return 0;
}
递归法:
#include <iostream>
using namespace std;
int fun(int x, int y){
if (x%y==0) return y;
else return fun(y, x%y);
}
int main( ){
int m, n, t, r;
cout<<"please imput two numbers"<<endl;
cin>>m>>n;
if(m<n) {
t=m; m=n; n=t;
}
r=fun(m, n);
cout<<"最大公约数是:"<<r<<endl;
return 0;
}
教材p26
area.h
double area(double 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);
area.cpp
#include<cmath>
#define PI 3.14159
double area(double radius){
return PI *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));
}
exp9_2.cpp
#include<iostream>
#include<cmath>
#include"area.h"
using namespace std;
#define PI 3.14159
int main(){
cout<<"Area of point is"<<area()<<'\n';
cout<<"Area of square is"<<area(1,1)<<'\n';
cout<<"Area of trapezium is"<<area(1,0.5,1)<<'\n';
cout<<"Area of triangle is"<<area(1,sqrt(1+0.5*0.5),sqrt(1+0.5*0.5),0)<<'\n';
return 0;
}
五、思考讨论题或体会或对改进实验的建议
感觉对多文件运行结构不是很透彻,运用多文件方式与不运用是否有什么区别?。

相关主题