计算3个A,2个B可以组成多少种排列的问题(如:AAABB, AABBA)是《组合数学》的研究领域。但有些情况下,也可以利用计算机计算速度快的特点通过巧妙的推理来
解决问题。下列的程序计算了m个A,n个B可以组合成多少个不同排列的问题。请完善它。
int f(int m, int n)
{
if(m==0 || n==0) return 1;
return _______________________;
}
分析:
由题目猜想要用到递规算法,,但按其数学公式较难解答,故寻找其结果特征。
N M | 0 | 1 | 2 | 3 | 4 | … |
0 | 1 | 1 | 1 | 1 | 1 | … |
1 | 1 | 2 | 3 | 4 | 5 | … |
2 | 1 | 3 | 6 | 10 | 15 | … |
3 | 1 | 4 | 10 | 20 | 35 | … |
4 | 1 | 5 | 15 | 35 | 70 | … |
… | … | … | … | … | … | … |
观察表格数据可以自出,N1M1 = N1M0+N0M1,N4M4 = N4M3+N3M4……也就是f(m,n) = f(m,n-1)+f(m-11,n);
解:
int f(int m, int n)
{
if(m==0 || n==0) return 1;
return f(m, n-1)+f(m-1, n);
}