这是一个相对理论性的问题,虽然语言是Java,但是任何通用解决方案都可以胜任。
假设我想编写一个简单的阶乘函数:
long factorial(int n)
{
//handle special cases like negatives, etc.
long p = 1;
for(int i = 1; i <= n; i++)
{
p = p * n;
}
return p;
}
但现在,我还想检查阶乘是否溢出(而不是简单地硬编码MAX_FACTORIAL_PARAMETER之类的内容)。一般来说,在乘法过程中检查溢出就像检查结果是否与原始输入相同一样简单。但在这种情况下,由于溢出可能发生在任何时候,每个循环中执行更多的除法和比较将非常昂贵。
因此,问题有两个方面-有没有办法解决阶乘问题的溢出,而不是在每个步骤检查乘法溢出或硬编码最大允许参数?
那么一般来说,我应该如何处理涉及多个迭代/递归阶段的问题,这些阶段可能会在每个阶段默默失败,而不会通过引入昂贵的检查来危及性能?