Вы никогда не измените 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