You never alter self.n, so it’ll always be greater or equal to 1. You created an endless loop. It’s set to 1 in __init__ so self.n >= 1 is true each time you test.
You should not use a local variable and a parameter to track the current state of the factorial function. Pick one or the other.
Without a parameter:
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
Note that you now pass the initial value of n to the class, to create an instance:
>>> f = Factorial(4)
>>> f.fact()
24
>>> f.n
0
This isn’t all that useful, because now the instance has n set to 0. Unless you assign something different to that attribute, calling f.fact() again will only produce 1 now.
This is not really a problem that needs to be solved with a class. If you pass the initial value of n is as a pramater, you don’t need an instance to track the state and you can just use a normal function:
def fact(n):
if n >= 1:
return n * fact(n - 1)
else:
return 1
The fact() function can be called as often as needed, with different values for n:
>>> fact(4)
24
>>> fact(8)
40320
1
solved Error in Factorial Program in Python