很多人对不定层迭代,用得都很晕乎。
其实很简单,以下就以m个n面的骰子掷到的点数的和为例,看看n面骰子的存在的概率组合方式。
#include <iostream>
// By Minsky
void SumIter(int sumCeil, int nNum, int mNum, int curNum, int *pNumArr)
{
curNum--;// 当前所处的层次
int sumTmp = sumCeil;// 该处做拷贝用于计算
for (int i=1; i<=nNum; i++)
{
sumCeil = sumTmp+ i;// 迭代的实际计算过程,修改此处,就可以得到各种的实际应用的迭代了
if (curNum == 0)// 最底层
{
pNumArr[sumCeil]++;// 最底层数据的存储
}
else
{
SumIter(sumCeil, nNum, mNum, curNum, pNumArr);
}
}
}
void SumSave(int nNum, int mNum, int *pNumArr)
{
int sumCeil = 0;
SumIter(sumCeil,nNum,mNum,mNum,pNumArr);
}
int main()
{
int nNum = 6;// 每个骰子的面数,每 层的循坏次数
int mNum = 2;// 骰子的个数,迭代的层次
int *pNum = (int*) malloc((nNum*mNum +1)*sizeof(int));
::memset(pNum,0x0,(nNum*mNum+1)*sizeof(int));
SumSave(nNum,mNum,pNum);
for(int i=0; i<nNum*mNum+1; i++)
{
std::cout<<i<<","<< pNum[i]<<std::endl;// 输出
}
free(pNum);
return 0;
}
代码如上。
比如nNum = 4,而mNum =3,则该代码等价于:
for()
{
for()
{
for()
{
}
}
}
该问题的衍生阐述可以理解为:
如果nNum = 2,mNum = 1,那么该问题则简化为抛硬币的问题,即是,一个硬币正反两面出现的排列组合。
如果nNum = 6,mNum = 2,就是我们平时麻将牌的骰子的排序数字啦。
如果nNum =13,mNum = 4,就是我们的4色球彩票的统计预期啦。
当然该模型如果稍微加以改进便可做成每层迭代都做特殊处理的方式。
当然这个如果只是作为计算概率的方式确实有点儿傻啦,指不定被概率出身的同行们耻笑呢。
看到网上没有相关的文章(也许是我不擅长词条挖掘吧),就发出来供刚刚接触这个的同学们一起探讨学习吧,更多可以联系我,http://blog.csdn.net/minkowsky。