Ошибка в факториальной программе в Python - PullRequest
0 голосов
/ 12 мая 2018

Когда я выполняю приведенный ниже код в Python 3, он выдаёт мне ошибку ниже.Может кто-нибудь объяснить мне, что не так в приведенном ниже коде.

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

class Factorial:
    def __init__(self):
        self.n=1
    def fact(self,n):    
        if self.n >= 1:
            return ((self.n) * (self.fact(n - 1)))
        else:
            return 1
a=Factorial()
print("4! =", a.fact(4))

Ошибка:

RecursionError: maximum recursion depth exceeded in comparison

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Вы можете изменить предел рекурсии с помощью sys.setrecursionlimit.

0 голосов
/ 12 мая 2018

Вы никогда не измените self.n, поэтому всегда будет больше или равно 1. Вы создали бесконечный цикл. Он установлен на 1 в __init__, поэтому self.n >= 1 имеет значение true при каждом тестировании.

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

без параметра:

class Factorial:
    def __init__(self, n):
        self.n = n
    def fact(self):
        n = self.n
        if n >= 1:
            self.n -= 1
            return n * self.fact()
        else:
            return 1

Обратите внимание, что теперь вы передаете начальное значение n классу , чтобы создать экземпляр:

>>> f = Factorial(4)
>>> f.fact()
24
>>> f.n
0

Это не так уж и полезно, потому что теперь для экземпляра n установлено значение 0. Если вы не назначите что-то другое для этого атрибута, повторный вызов f.fact() вызовет только 1 сейчас.

Это на самом деле не проблема, которую нужно решать с классом. Если вы передаете начальное значение n в качестве праматера, вам не нужен экземпляр для отслеживания состояния, и вы можете просто использовать обычную функцию:

def fact(n):
    if n >= 1:
        return n * fact(n - 1)
    else:
        return 1

Функцию fact() можно вызывать так часто, как это необходимо, с различными значениями для n:

>>> fact(4)
24
>>> fact(8)
40320
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...