递归检测数字是不是为阶乘

Posted

技术标签:

【中文标题】递归检测数字是不是为阶乘【英文标题】:Detect if number is factorial recursively递归检测数字是否为阶乘 【发布时间】:2021-12-31 12:26:54 【问题描述】:

需要创建一个函数来评估特定数字是否为阶乘。

为此,我构建了以下内容,并且正在运行

def is_factorial(n):
    i = f = 1
    while f < n:
        i += 1
        f *= i
    return f == n

但是,现在我需要让它递归,但我正在努力解决它。

到目前为止,我已经设法做到以下几点

def isFactorial(m):
    def factorial(x):
        if x == 0:
            return 1
        else:
            return x * factorial(x - 1)
    
    if m == 1:
        return True 
    elif m == 720:
        return True
    else:
        factorialnumbers = []

感谢任何帮助。

编辑:很抱歉,但我忘记指定该函数应仅将一个整数作为输入。

【问题讨论】:

softwareengineering.stackexchange.com/questions/279004/… 有帮助吗? 为什么要让它递归。它非常好,有些什么有效?如果你有大量的测试,你可以建立一个阶乘表,直到要测试的值的最大值。 除了将循环机械地转换为递归之外,没有像 factorial 本身那样的“好的”递归版本。 【参考方案1】:
def is_factorial(n, i=1):
    n = n/i
    if n == 1:
        return True
    if n < 1:
        return False
    i += 1
    return is_factorial(n, i)


print(is_factorial(24))

【讨论】:

这不能保证有效。 n/i 可以任意接近 1 而没有 等于 1,因此浮点不精确会给您带来误报。 应该使用 n = n // i 以避免 chepner 指出的浮动问题。 如果n/i 非常接近1,那么测试的数字几乎是阶乘。演示尝试is_factorial(24-10e-8)is_factorial(24-10e-16)【参考方案2】:

你可以的

def isfact(m,n):
  def fact(n):
      if n==1 or n==0:
          return 1
      else:
          return n*fact(n-1)
  if fact(n) == m:
      return True
  else:
      return False

【讨论】:

以上是关于递归检测数字是不是为阶乘的主要内容,如果未能解决你的问题,请参考以下文章

使用参数递归的数字阶乘(如参数列表中的函数调用)

递归_三角数字和阶乘

大数求阶乘(防溢出)

大数乘法,递归计算50的阶乘

Python3基础 用 函数递归求解 一个数字的阶乘

递归求阶乘