问题描述
我是这个编码世界的新手。对不起,对于这样一个菜鸟问题。 我试图使用类运行阶乘函数。但是收到以下错误:“TypeError:factorial() 缺少 1 个必需的位置参数:'input'”。
请你们解释一下这里的问题以及如何解决这个问题。
class cool:
def __init__(self,input):
self.input = input
def factorial(self,input):
self.input = input
if self.input == 0 :
return(1)
else:
return( factorial(self.input-1) * self.input)
var = cool(3)
print(var.factorial())
解决方法
我会回应其他人的评论,在这样的类中编写 factorial
很奇怪,但希望它展示了类方法也可以递归。
递归是一种函数式遗产,因此将其与函数式风格结合使用会产生最佳效果。这意味着避免诸如突变、变量重新分配和其他副作用之类的事情 -
class cool:
def __init__(self,v):
self.v = v
def factorial(self):
if self.v == 0:
return 1
else:
return self.v * cool(self.v - 1).factorial()
print(cool(3).factorial())
print(cool(4).factorial())
print(cool(5).factorial())
print(cool(6).factorial())
print(cool(7).factorial())
6
24
120
720
5040
您可以考虑的一项调整是处理负数 -
class cool:
def __init__(self,v):
self.v = v
def factorial(self):
if self.v == 0:
return 1
elif self.v < 0:
return -1 * cool(self.v * -1).factorial()
else:
return self.v * cool(self.v - 1).factorial()
现在它适用于正数和负数 -
print(cool(7).factorial())
print(cool(-7).factorial())
5040
-5040
,
我不知道你为什么要使用类。
这里是修复:
class cool:
def __init__(self,input):
self.input = input + 1 #<----
def factorial(self): #<----
if self.input == 1 : #<----
return 1
else:
self.input -= 1 #<----
result = self.input * self.factorial() #<----
return result
var = cool(3)
print(var.factorial())
self.input * self.factorial()
这样做而不是 self.factorial() * self.input
为什么???
因为在后一种情况下 self.input 将变为 0。因为你在做递归,每次你的输入最终都会减少。递归完成后,返回值将通过此 self.input 获得多个(已变为零。)
,使用制表符,方法必须在类中。 也许使用模块数学中的函数阶乘更好?