急!求C++程序修改!

来源:百度知道 编辑:UC知道 时间:2024/05/31 19:13:09
1. 函数嵌套调用是在被调用的函数内再调用其它函数,而递归调用是在被调函数内调用自身。嵌套调用的层数没有限制,而递归调用函数必须包含使递归终止的语句。
范例:求组合数,
[分析] 求组合数要用到求阶乘,可将求阶乘定义为一个函数,在求组合数的函数中嵌套调用阶乘函数。由于n!=n*(n-1)!,求阶乘是一个典型的递归算法,在此用递归方法实现。
#include <iostream>
using namespace std;
long com(int ,int), fac(int); //函数声明
int main(){
int m,n;
cout<<"Please input two numbers m,n(m<n): \n";
cin>>m>>n;
if(m<=n) cout<<"C(m,n)="<<com(m,n)<<endl;
else cout<<"Input Error!\n";
return 0;
}
long com(int i,int j){
long cmb; // att: A
cmb= fac(j)/(fac(i)*fac(j-i)); //在com函数内嵌套调用fac函数
return cmb;
}
long fac(int i){
long fcl; // att:B
if(i==0||i==1) fcl =1; //使递归结束的语句
else fcl = i*fac(i-1); //递归调用
return fcl;
}
这里因阶乘极易溢出,n最大取12,否则运算中会发生溢出。
[注意] 在函数内定义局部变量时,变量名不应与函数名相同,例如,在A行,不可定义变量名为com,在B处,不可为fac;还

1.举个例子吧,当i=1的时候,fac(i) =1; 左边就是fac(1),这是个常量,不是变量,不能赋值。

2.
#include <iostream>
using namespace std;
long com(int,int); //函数声明,c(m,n)=c(m-1,n)*(n-(m-1))/m
int main()
{
int m,n;
cout<<"Please input two numbers m,n(m<n): \n";
cin>>m>>n;
if(m<=n)
cout<<"C(m,n)="<<com(m,n)<<endl;
else
cout<<"Input Error!\n";
return 0;
}
long com(int m,int n)
{
if(m==1)
return n;
else
return com(m-1,n)/m*(n-(m-1));
}

以上代码在VC++下运行通过,n可以取到40

其实还有很多算法的,我比较喜欢用C(m,n)=C(m-1,n)+C(m-1,n-1),要写个大整数加减的算法。。。即使n取到65535都可以算。。。

fac(i)的结果是临时的,不能作为=号左边的值。

//没什么特别限制的话直接用更大的空间来存储结果好了。最差的情况自己写个高位数乘法计算。
#include <iostream>
using namespace std;
long long com(int ,int);//函数声明
int main(){
int m,n;
while(1)
{