Это довольно теоретический вопрос, поэтому, хотя язык определенно является 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 или чего-то подобного).В общем, проверка переполнения во время умножения так же проста, как проверка результата по исходным входам, но в этом случае, поскольку переполнение может произойти в любой точке, было бы довольно дорого выполнять больше делений и сравнений в каждом цикле.*
Тогда возникает двоякий вопрос: есть ли способ решить факторную проблему переполнения без проверки переполнения умножения на каждом шаге или жесткого кодирования максимально допустимого параметра?
И вообще какя должен подходить к проблемам, которые включают много этапов итерации / рекурсии, которые могут молча завершаться сбоем на каждом этапе без ущерба для производительности, вводя дорогие проверки на каждом?