因子函数产生错误的结果

时间:2013-04-06 17:47:24

标签: python recursion factorial

我知道有多种方法可以计算整数的阶乘,并且有一个math模块。但是我试图将一个返回错误结果的简单函数放在一起。我很想知道这里出了什么问题。例如,如果我将2作为参数传递它返回3,如果3则返回8.

>>>def factorial(n):

        if n > 0:
            result = n * n-1
            factorial(n-1)
            return result 

>>>factorial (2)

   3

我该如何解决这个问题?

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的回答