这是一个相当理论化的问题,因此虽然该语言是 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 或类似内容进行硬编码)。一般来说,在乘法期间检查溢出就像根据原始输入检查结果一样简单,但在这种情况下,由于溢出可能在任何点发生,因此在每个循环中执行更多除法和比较将相当昂贵。
那么问题是双重的——有没有办法解决溢出的阶乘问题,而无需在每一步检查乘法溢出或硬编码最大允许参数?
一般来说,我应该如何处理涉及多个迭代/递归阶段的问题,这些问题可能在每个阶段默默地失败,而不会通过在每个阶段引入昂贵的检查来影响性能?
虽然 Java 无法帮助您解决此问题,但肯定有一些语言可以帮助您解决溢出问题。例如,C# 提供了检查关键字 http://msdn.microsoft.com/en-us/library/74b4xzyw%28v=VS.80%29.aspx。在下面,此功能可能使用硬件支持的形式溢出标志 http://en.wikipedia.org/wiki/Overflow_flag.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)