递归检测数字是不是为阶乘
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
【讨论】:
以上是关于递归检测数字是不是为阶乘的主要内容,如果未能解决你的问题,请参考以下文章