DEV C++运行C++概率计算代码无输出,疑似大分数值导致,如何解决?
问题原因分析
- 核心问题是阶乘函数
findFact未处理n=0的输入场景:计算组合数C(m,0)或者C(m,m)时,会触发findFact(0)调用,原函数仅在n==1时返回1,n=0时会进入无限递归(n持续递减为负数,永远达不到终止条件),程序卡在递归调用环节自然无法输出结果,和分数值大小无关。 - 次要问题:int类型存储阶乘数值上限较低,如果后续扩大计算场景很容易出现整数溢出,可优化组合数计算逻辑避免溢出。
- 额外小概率问题:部分编译环境下cout输出后如果没有刷新缓冲区,也可能出现控制台无显示的情况。
修复方案
首先修改阶乘函数的终止条件,补充0! = 1的逻辑即可解决无输出问题,优化后代码如下:
#include<iostream> #include<cmath> using namespace std; float san= 0.25 ; float var= 0.75; int findFact(int n)//factorial { // 补充n=0的终止条件,0的阶乘为1 return n <= 1 ? 1 : n * findFact(n - 1); } int findNcR(int n, int r)//combination nCr { return findFact(n) / (findFact(n - r) * findFact(r)); } double prob(int s, int v){ //recursive function for probability if(s>=5) return 1; if(v>=5) return 0; double sum = 0; int m = 5-s; for( int i=0; i<=m; i++){ sum += prob(s+i,v+m-i)*findNcR(m,i)*pow(san,i)*pow(var,m-i); } return sum; } int main(){ cout<< prob(2,1); // 主动刷新输出缓冲区,确保内容正常打印 cout << endl; return 0; }
运行修正后的代码,可以得到输出结果约为0.896484。
内容的提问来源于stack exchange,提问作者Mia
相关产品推荐
相关产品推荐

