Как вычисляется факториал?

Скажем, есть функция для расчета факториала (n)

Факториал (7) создает 7 функциональных объектов для каждого из n от 1 до 7

и используйте эти значения, когда это необходимо (для факториала (8) как факториала (7)*8)

3 ответа

Решение

Это зависит от языка и языковой реализации.

Во многих функциональных языках (например, Haskell) функция гарантированно ничего не изменит; только чтобы вернуть значение. Отсутствие побочных эффектов позволяет языку запоминать / кэшировать или "запоминать" результаты вызовов функций.

В менее изощренном языке 7 различных фреймов вызова функций могут быть помещены в стек и вытолкнуты.

Правильно написанная факториальная функция во многих функциональных языках также будет хвостовой рекурсивной; в этом случае язык может просто перейти с нижней части функции на верхнюю, чтобы избежать вызова другой функции. В этом случае язык превращает рекурсивную функцию в цикл "бесплатно".

Зависит от того, что вы говорите о рекурсивной факториальной функции:

int factorial(int n) {
    return n>=1 ? n * factorial(n-1) : 1;
}

Эта функция будет рекурсивно вызывать себя количество раз, необходимое для вычисления данного факториала (n).

В основном все рекурсивные функции могут быть преобразованы в итеративное решение с помощью стека для накопления последовательных результатов...

int factorial(int n) {
    int accu = 1;
    int i;
    for(i = 1; i <= n; i++) {
        accu *= i;
    }
    return accu;
}

Оно может. То, что вы спрашиваете, звучит как напоминание - вы сохраняете предыдущие результаты, чтобы ускорить вычисления позже. Так, например, если вы вычислите 9!, вы можете сохранить значения для 1! .. 9!, а если вас попросят 8! позже вы можете просто вернуть сохраненное значение. Точно так же, если попросить 10!, вы можете вычислить 10×9! быстро.

Дело в том, что факториал (n) растет так быстро, что при больших значениях n вы можете в конечном итоге использовать много памяти, поэтому пространственно-временная торговля может оказаться бесполезной.

Другая функция, которая может эффективно использовать запоминание, - это вычисление чисел Фибоначчи.

Другие вопросы по тегам