这是一个相当理论化的问题,因此尽管该语言专门是 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 或类似的东西)。通常,在乘法过程中检查溢出就像检查原始输入的结果一样简单,但在这种情况下,由于溢出可能发生在任何时候,因此在每个循环中执行更多的除法和比较会相当昂贵。
那么问题是双重的——有没有办法解决溢出的阶乘问题,而不需要在每一步检查乘法溢出或硬编码最大允许参数?
一般来说,我应该如何处理涉及迭代/递归的多个阶段的问题,这些阶段可能会在每个阶段静默失败,而不会通过在每个阶段引入昂贵的检查来影响性能?