我知道有多种方法可以计算整数的阶乘,并且有一个math
模块。但是我试图将一个返回错误结果的简单函数放在一起。我很想知道这里出了什么问题。例如,如果我将2作为参数传递它返回3,如果3则返回8.
>>>def factorial(n):
if n > 0:
result = n * n-1
factorial(n-1)
return result
>>>factorial (2)
3
我该如何解决这个问题?
答案 0 :(得分:8)
你在这里错过了几件不同的东西。首先,您需要实际乘以递归调用的结果,否则递归不会为您做任何事情。其次,您需要为递归结束指定基本案例。也就是说,当n == 0时,你需要告诉函数该做什么。你正在寻找类似的东西:
if n == 0:
return 1
elif n > 0:
return n * factorial(n-1)
我的python是生锈的,因此语法可能会关闭,但你明白了。
另外,请注意,您获得的回报的原因是您的函数实际上是在计算n*n-1
,由于操作顺序的原因,您只需要比n
的平方小一个。{/ p>
还有一件事,只是为了好玩。我到目前为止编写的函数将为大数字创建一个大堆栈,这可能是也可能不是一个好主意。所以另一种方法是使其尾递归。许多编译器将优化尾递归函数,但根据Python没有的评论。要做到这一点,你想实现一个累加器,如下所示:
def factorial(acc, n):
if n == 0:
return acc
elif n > 0:
return factorial(n*acc, n-1)
然后您将使用factorial(1,n)
调用该函数,或者您也可以将其编写为帮助您处理该部分的辅助函数。
答案 1 :(得分:4)
你的功能有几个问题:
n > 0
为假,则不返回任何内容。n * n-1
计算(n * n) - 1
,您可能打算n * (n - 1)
factorial
,但随后不对结果执行任何操作。目前,您的代码就像在if。return n * n - 1
一样
答案 2 :(得分:1)
你只需要这个,我认为最简单的形式:
def factorial(n):
if n == 0: return 1
return n * factorial(n-1)
一些运行:
>>> factorial(1)
1
>>> factorial(13)
6227020800
您也可以使用此表单:
def factorial(n):
if(n): return n*factorial(n-1)
return 1
@ sepp2k的回答