}
return0;
}
doublesroot(doublea){
doublex=a/2;
while(fabs((x-a/x)/2)>1e-7)x=(x+a/x)/2;
return(x);
}
2、设计一个简单的计算器程序,从键盘输入“+35”代表表达式“3+5”,程序读入运算符和数据,
调用Calculate()函数,根据运算符进行加、减、乘、除四则运算。
要求能反复执行这一过程,直到用户输入“#”符号作为运算符为止。
函数原型如下:
doubleadd(double,double);//加
doubleminus(double,double);//减
doublemulti(double,double);//乘
doublediv(double,double);//除
doubleCalculate(double,double,char);//运算符作为字符数读入
#include
usingnamespacestd;
doublecaculate(charop,doublen1,doublen2);
intmain(){
doublen1,n2;
charop;
do{
cout<<"pleaseinputop,n1,n2"<cin>>op>>n1>>n2;
cout<}while(op!
='#');
return0;
}
doublecaculate(charop,doublen1,doublen2){
switch(op){
case'+':
return(n1+n2);
case'-':
return(n1-n2);
case'*':
return(n1*n2);
case'/':
return(n1/n2);
}
}
3、
3设计一个求两个数的最大公约数和最小公倍数的通用函数,要求能反复输入数据并输出其结果。
【提示】可用枚举法,从两数中的小者开始尝试,并逐步往下取值,直到找到最大公约数。
#include
usingnamespacestd;
intfun1(inta,intb){
intn,k,t;
n=a;
do{k=n%a;
t=n%b;
n=n+1;
}while(k!
=0||t!
=0);
returnn-1;}
intfun2(inta,intb){
intr;
for(;;){
r=a%b;
if(r==0)break;
a=b,b=r;
}
returnb;
}
intmain()
{inta,b;
cout<<"pleaseinputaba>b"<cin>>a>>b;
cout<<"最小公倍"<cout<<"最大公约"<return0;
}
歌德巴赫猜想指出:
任何一个充分大的偶数都可以表示为两个素数之和。
例如:
4=2+26=3+38=3+510=3+710=5+5……50=3+47将4-50之间的所有偶数用两个素数之和表示。
判断一个整数是否为素数用函数完成。
4.歌德巴赫猜想指出:
任何一个充分大的偶数都可以表示为两个素数之和。
例如:
4=2+26=3+38=3+510=3+710=5+5……50=3+47将4-50之间的所有偶数用两个素数之和表示。
判断一个整数是否为素数用函数完成。
程序如下:
#include
#include
usingnamespacestd;
intfun(int);
intmain(){
inti,j,k,p,q;
for(i=4;i<=50;i+=2){
cout<
";
for(j=2;j
p=fun(j);
for(k=2;k
q=fun(k);
if(i==p+q&&p!
=0&&q!
=0&&p<=q)cout<
}}}
return0;
}
intfun(intm){
inti,n;
n=sqrt(m);
if(m==2)return2;
else{
for(i=2;i<=n;i++)if(m%i==0)break;
if(i>n)returnm;
elsereturn0;
}
}
实验八函数递归算法
一、实验目的
1、掌握函数的嵌套调用和递归调用
2、掌握递归算法
二、实验内容
1.函数嵌套调用是在被调用的函数内在调用其他函数,而递归调用时在被调用函数内调用自身。
嵌套调用的层数没有限制,而递归调用函数必须包含使递归终止的语句。
范例:
求组合数Cnm=n!
/[m!
(n-m)!
](m为指数)
【分析】求组合数要用到求阶乘,可将求阶乘定义为一个函数,在求组合数的函数中嵌套调用阶乘函数。
由于n!
=n*(n-1)!
,求阶乘是一个典型的递归算法,在此用递归方法实现。
#include
usingnamespacestd;
longcom(int,int),fac(int);
intmain(){
intm,n;
cout<<"pleaseinputtwonumbersm,n(m\n";
cin>>m>>n;
if(m<=n)cout<<"c(m,n)="<elsecout<<"inputerror!
\n";
return;
}
longcom(inti,intj){
longcmb;
cmb=fac(j)/(fac(i)*fac(j-i));
returncmb;
}
longfac(inti){
longfcl;
if(i==0||i==1)fcl=1;
elsefcl=i*fac(i-1);
returnfcl;
}
注意】
(1)因为阶乘极易发生溢出,所以n最大值取12,否则运算中会发生溢出。
(2)在函数内定义局部变量时,变量名不应与函数名相同。
例如,在A行,不可定义变量名为com;在B行不可定义变量名为fac;否则程序编译会出错误。
(3)还有一种常见错误,例如:
longfac(inti)
{if(i==0||i==1)fac(i)=1;
elsefac(i)=i*fac(i-1);
returnfac(i);}
编译此程序,会出现提示信息Left_valuerequired的错误,请思考这是为什么?
然后修改正确修改为:
longfac(inti){
longfcl;//B
if(i==0||i==1)fcl=1;
elsefcl=i*fac(i-1);
returnfcl;即可。
用递归函数实现勒让德多项式。
在主函数中求P4(1.5)。
#include
usingnamespacestd;
doublelrd(int,double);
intmain(){
intn,x;
cout<<"Inputn,x:
"<cin>>n>>x;
cout<<"Pn(x)="<return0;
}
doublelrd(intn,doublex){
if(n==0)return1;
if(n==1)returnx;
if(n>1)return((2*n-1)*x*lrd(n-1,x)-(n-1)*lrd(n-2,x))/n;
}