下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题.请完善它.int f(int m,int n) { if(m==0 f(m-1,n-1)*(m+n)*(m+n-1)/(m*n); 理解不了.谁能解释下意思

来源:学生作业帮助网 编辑:作业帮 时间:2024/05/02 11:03:17
下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题.请完善它.int f(int m,int n) { if(m==0 f(m-1,n-1)*(m+n)*(m+n-1)/(m*n); 理解不了.谁能解释下意思

下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题.请完善它.int f(int m,int n) { if(m==0 f(m-1,n-1)*(m+n)*(m+n-1)/(m*n); 理解不了.谁能解释下意思
下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题.请完善它.int f(int m,int n) { if(m==0
f(m-1,n-1)*(m+n)*(m+n-1)/(m*n); 理解不了.谁能解释下意思

下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题.请完善它.int f(int m,int n) { if(m==0 f(m-1,n-1)*(m+n)*(m+n-1)/(m*n); 理解不了.谁能解释下意思
因为m个A n个B的排列一共有(m+n)!/(m!*n!)
而m-1个A n-1个B的排列一共有(m+n-2)!/((m-1)!*(n-1)!)
(m+n)!/(m!*n!)/(m+n-2)!/((m-1)!*(n-1)!)=(m+n)*(m+n-1)/(m*n)
所以m个A n个B的排列数=m-1个A n-1个B的排列数*(m+n)*(m+n-1)/(m*n)

你看看这个答案
return f(m - 1, n) + f(m,n-1);
简单的测试了 是正确的,我也不能确定 但是可以肯定的是 这里根本不可能是特别复杂的计算。正确的答案一般都是简单明了的。
至于这个答案:
if(m==0 || n==0)
return 1;
return f(m-1,n-1)...

全部展开

你看看这个答案
return f(m - 1, n) + f(m,n-1);
简单的测试了 是正确的,我也不能确定 但是可以肯定的是 这里根本不可能是特别复杂的计算。正确的答案一般都是简单明了的。
至于这个答案:
if(m==0 || n==0)
return 1;
return f(m-1,n-1)*(m+n)*(m+n-1)/(m*n);
我测试了 和我的答案是一样的。但是性能上~~~我的那个答案没有除法没有乘法,运算速度上肯定优于这个答案,而且简单明了
附上我的测试代码:
#include
#include
int f(int m, int n)
{
if(0 == n || 0 ==m)
return 1;
return f(m-1,n-1)*(m+n)*(m+n-1)/(m*n);
}
int f2(int m, int n)
{
if(0 == n || 0 ==m)
return 1;
return f2(m-1,n) + f2(m,n-1);
}
int main(int argc, char* argv[])
{
int i, j;
for(i = 0; i < 10; i ++)
for(j = 0; j < 10; j ++)
{
int fval, f2val;
fval = f(i,j);
f2val = f2(i,j);
printf("%d : %d f1 = %4d f2 = %4d they are %s\n"
,i,j
,fval,f2val
,fval == f2val? "same" : "different");
}
return EXIT_SUCCESS;
}
希望能帮助到你
望采纳

收起

int f(int m, int n)
{
if(m==0 || n==0)
return 1;
return f(m-1,n-1)*(m+n)*(m+n-1)/(m*n);
/*
这道题用递归,是肯定的。
另外,这应该是一道数学题。
高中的排列组合问题:
m个A,n个B可以...

全部展开

int f(int m, int n)
{
if(m==0 || n==0)
return 1;
return f(m-1,n-1)*(m+n)*(m+n-1)/(m*n);
/*
这道题用递归,是肯定的。
另外,这应该是一道数学题。
高中的排列组合问题:
m个A,n个B可以组合成(m+n)!/(m!*n!)个不同排列。
最后的返回值表达式就是递归出(m+n)!/(m!*n!)的。
对手,祝你好运!希望能在北京见。
*/
}

收起

就是在M+N个数中取M个数的问题(或取N个)
是排列组合的 .C 下标m+n,上标m.
就是(m+n)!/(m!*n!)
由于分子分母递归次数相同.
而分子明显比分母大,所以分子要分成两部分m+n和m+n-1,,以加快它减到0的速度
(m+n)(m+n-1)(m+n-2)(m+n-3)......1/(m(m-1).....1 * n(n-1).......

全部展开

就是在M+N个数中取M个数的问题(或取N个)
是排列组合的 .C 下标m+n,上标m.
就是(m+n)!/(m!*n!)
由于分子分母递归次数相同.
而分子明显比分母大,所以分子要分成两部分m+n和m+n-1,,以加快它减到0的速度
(m+n)(m+n-1)(m+n-2)(m+n-3)......1/(m(m-1).....1 * n(n-1)......1)
希望杭州见你啊....我们都是打酱油的。。。O(∩_∩)O哈哈~

收起

我觉得貌似你的答案有点问题- -、
f(m-1,n-1)*(m+n)*(m+n-1) 应该这样就可以了、
原理是递归调用、
这个题目是求(m+n)!的意思、
就是(m+n)*(m+n-1)*……*1
用 f(m-1,n-1)这样的就少了m+n-1、
所以在本次中是 (m+n)*(m+n-1)
比如说是m=2.n=2;
f(1,1...

全部展开

我觉得貌似你的答案有点问题- -、
f(m-1,n-1)*(m+n)*(m+n-1) 应该这样就可以了、
原理是递归调用、
这个题目是求(m+n)!的意思、
就是(m+n)*(m+n-1)*……*1
用 f(m-1,n-1)这样的就少了m+n-1、
所以在本次中是 (m+n)*(m+n-1)
比如说是m=2.n=2;
f(1,1)*4*3
f(0.0)*2*1
f(0,0) 是return 1;
再返回上去就是、
4*3*2*1*1

收起