在类内递归计算阶乘

时间:2019-05-06 17:46:30

标签: python

代码有什么问题?如果我不使用课堂,这是正确的。如果我使用课程,则会收到错误消息:

  

TypeError:*:'int'和'factorial'不受支持的操作数类型

class factorial(object):
    def __init__(self,number):
        self.number = number
    def factorial(self):
        if self.number == 1:
            return 1
        else:
            result = self.number * factorial(self.number-1)
            return result

def main():
    fac = factorial(5)
    print(fac.factorial())

if __name__ == "__main__":
    main()

4 个答案:

答案 0 :(得分:0)

我对您在else块中添加的代码进行了较小的修改。

class factorial(object):
    def __init__(self,number):
        self.number = number
    def factorial(self):
        if self.number == 1:
            return 1
        else:
            self.number -= 1
            result = self.number * self.factorial()
            return result

def main():
    fac = factorial(5)
    print(fac.factorial())

if __name__ == "__main__":
    main()

答案 1 :(得分:0)

错误消息试图指出您正在尝试执行python解释器不知道如何执行操作的方向。该错误是int和阶乘不支持的操作数类型。因此,在您的代码中,您尝试执行以下行:

result = self.number * factorial(self.number-1)

因此,在此行中,您尝试将一个int(self.number)与一个对象factorial(self.number-1)相乘。您正在调用阶乘构造函数,而不是尝试在数字-1上运行阶乘。为了使这项工作有效,您需要乘以另一个数字,而不是对象(阶乘类型)。

答案 2 :(得分:0)

HI @bogortron和@Manoj, 我有正确的原因和答案,但是我不明白的是,当我仅使用函数时,这种方法就可以正常工作:

def factorial(number):
    if number == 1:
        return 1
    else:
        result = number * factorial(number-1)
        return result  
print(factorial(5))  

此代码运行并给出正确的结果。

答案 3 :(得分:0)

您正在为类factorial及其方法factorial(self)使用相同的名称,我认为这就是问题的根源。当您写时:

result = self.number * factorial(self.number-1)

您希望结果将得到self.number的值乘以self.number-1的阶乘。但是对于Python解释器,factorial(self.number-1)不是数字,而是对象(实际上是int的包装器)。如果您写:

result = self.number * factorial(self.number-1).factorial()

您在对象factorial上调用方法factorial,一切正常。

但是,就像您在自己的答案中所做的那样,您不需要在这里上课。