2013-04-06 1 views
-3

Я знаю, что существует более одного способа вычисления факториала целого числа, а также есть модуль math. Однако я попытался собрать простую функцию, возвращающую неправильный результат. Я хотел бы знать, что здесь не так. Например, если я передаю 2 в качестве параметра, он возвращает 3, если 3 возвращается 8.Факториальная функция, производящая неправильные результаты

>>>def factorial(n): 

     if n > 0: 
      result = n * n-1 
      factorial(n-1) 
      return result 

>>>factorial (2) 

    3 

Как это исправить?

+1

Что делать, если n равно 0? – squiguy

ответ

4

Есть несколько вещей, которые не так с вашей функции:

  • Ты ничего не возвращается, если условие n > 0 ложно.
  • n * n-1 вычисляет (n * n) - 1, вы, вероятно, предназначен n * (n - 1)
  • Вы называете factorial рекурсивно, но ничего с результатом не делать. В настоящее время ваш код действует так же, как если бы вы только написали return n * n - 1 внутри if.
8

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

+1

Нет необходимости в другом. И это 'elif' в Python в любом случае. – squiguy

+0

Спасибо, еще не закончили кодирование Python. –

+0

Я просто не хотел, чтобы ваше сообщение атаковали другие :). Так +1 для вас. – squiguy

1

Вам просто нужно это, я думаю, что простой вид:

def factorial(n): 
    if n == 0: return 1 
    return n * factorial(n-1) 

несколько трасс:

>>> factorial(1) 
1 
>>> factorial(13) 
6227020800 

Вы также можете использовать эту форму:

def factorial(n): 
    if(n): return n*factorial(n-1) 
    return 1 

свой вид добавление с ответом @ sepp2k