-3

我知道计算整数阶乘的方法不止一种,还有一个math模块。但是我试图组合一个返回错误结果的简单函数。我很想知道这里出了什么问题。例如,如果我将 2 作为参数传递,则返回 3,如果为 3,则返回 8。

>>>def factorial(n):

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

>>>factorial (2)

   3

我怎样才能解决这个问题?

4

3 回答 3

8

你在这里错过了一些不同的东西。首先,您实际上需要乘以递归调用的结果,否则递归不会为您做任何事情。其次,您需要指定递归结束的基本情况。也就是说,您需要告诉函数当 n == 0 时该做什么。您正在寻找类似的内容:

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

我的 python 生锈了,所以语法可能会关闭,但你明白了。

另外,请注意,您获得回报的原因是您的函数本质上是在计算n*n-1,由于运算顺序的原因,它使您比 的平方小一n

还有一件事,只是为了好玩。到目前为止,我编写的函数将为大数字创建一个大堆栈,这可能是一个好主意,也可能不是一个好主意。因此,另一种方法是使其尾递归。许多编译器将优化尾递归函数,尽管根据评论 Python 没有。为此,您需要实现一个累加器,如下所示:

def factorial(acc, n):
    if n == 0:
        return acc
    elif n > 0:
        return factorial(n*acc, n-1)

然后,您将使用 调用该函数factorial(1,n),或者您也可以将其编写为为您处理该部分的辅助函数。

于 2013-04-06T17:50:32.363 回答
4

您的功能有几个问题:

  • n > 0如果条件为假,您不会返回任何内容。
  • n * n-1计算(n * n) - 1,你可能打算n * (n - 1)
  • factorial递归调用,但随后不对结果执行任何操作。目前,您的代码就像您只return n * n - 1在 if 中编写一样。
于 2013-04-06T17:52:02.033 回答
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 的回答相加

于 2013-04-06T17:54:02.667 回答