これはかなり理論的な質問なので、言語は特に 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 などをハードコーディングする必要はありません)。一般に、乗算中のオーバーフローのチェックは、元の入力に対して結果をチェックするのと同じくらい簡単ですが、この場合、オーバーフローはどの時点でも発生する可能性があるため、すべてのループでより多くの除算と比較を実行すると、かなりコストがかかります。
問題は 2 つあります。すべてのステップで乗算オーバーフローをチェックしたり、最大許容パラメーターをハードコーディングしたりせずに、オーバーフローの階乗問題を解決する方法はありますか?
そして一般的に、各段階で高価なチェックを導入することでパフォーマンスを損なうことなく、すべての段階で静かに失敗する可能性がある反復/再帰の多くの段階を含む問題にどのようにアプローチすればよいでしょうか?