Python:递归因子

问题描述

我是这个编码世界的新手。对不起,对于这样一个菜鸟问题。 我试图使用类运行阶乘函数。但是收到以下错误:“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 获得多个(已变为零。)

,

使用制表符,方法必须在类中。 也许使用模块数学中的函数阶乘更好?