下列的程序计算了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/07/01 23:39:57
![下列的程序计算了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); 理解不了.谁能解释下意思](/uploads/image/z/1581362-26-2.jpg?t=%E4%B8%8B%E5%88%97%E7%9A%84%E7%A8%8B%E5%BA%8F%E8%AE%A1%E7%AE%97%E4%BA%86m%E4%B8%AAA%2Cn%E4%B8%AAB%E5%8F%AF%E4%BB%A5%E7%BB%84%E5%90%88%E6%88%90%E5%A4%9A%E5%B0%91%E4%B8%AA%E4%B8%8D%E5%90%8C%E6%8E%92%E5%88%97%E7%9A%84%E9%97%AE%E9%A2%98.%E8%AF%B7%E5%AE%8C%E5%96%84%E5%AE%83.int+f%28int+m%2Cint+n%29+%7B+if%28m%3D%3D0+f%28m-1%2Cn-1%29%2A%28m%2Bn%29%2A%28m%2Bn-1%29%2F%28m%2An%29%3B+%E7%90%86%E8%A7%A3%E4%B8%8D%E4%BA%86.%E8%B0%81%E8%83%BD%E8%A7%A3%E9%87%8A%E4%B8%8B%E6%84%8F%E6%80%9D)
下列的程序计算了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
收起