Вам не хватает пары разных вещей здесь. Во-первых, вам нужно фактически умножить результат рекурсивного вызова, иначе рекурсия ничего не сделает для вас. Во-вторых, вам нужно указать базовый регистр для завершения рекурсии. То есть, вы должны указать функцию, что делать, когда п == 0. Вы ищете что-то вроде:
if n == 0:
return 1
elif n > 0:
return n * factorial(n-1)
Моего питона ржавая, так что синтаксис может быть выключен, но вы получите идею.
Кроме того, обратите внимание, что причина получения вами данных заключается в том, что ваша функция по существу вычисляет n*n-1
, что из-за порядка операций дает вам меньше квадрата n
.
Еще одна вещь, просто для удовольствия. Функция, которую я написал до сих пор, создаст большой стек для больших чисел, что может быть или не быть хорошей идеей. Таким образом, альтернатива заключается в том, чтобы сделать его хвостовым рекурсивным. Многие компиляторы будут оптимизировать хвостовые рекурсивные функции, хотя, по словам Python, это не так. Для этого требуется реализовать аккумулятор, например, так:
def factorial(acc, n):
if n == 0:
return acc
elif n > 0:
return factorial(n*acc, n-1)
Затем вы вызываете функцию с factorial(1,n)
, или вы также можете написать это как вспомогательную функцию, которая обрабатывает эту часть для вас.
Что делать, если n равно 0? – squiguy