递归:为什么函数返回一个数字的阶乘而不是返回1?

时间:2016-11-02 13:48:27

标签: python algorithm recursion data-structures

def fact(n):
    if n == 0:
        return 1
    else:
        return n * fact(n-1)


def rec():
    print fact(5)

rec()

[来自新手的问题]

Python脚本。

这个问题在很长一段时间内都存在,让我解释一下我到目前为止对递归的理解。

rec()函数中,我再调用了一个函数 fact(5),现在该过程转到了fact(n)函数。

函数调用自身直到基本情况。

在其他部分

5 * fact(4)

5 * 4 *事实(3)

5 * 4 * 3 *事实(2)

5 * 4 * 3 * 2 *事实(1)

现在n的值变为0,返回1

我的问题是,为什么事实(n)函数返回120而不是1。

def check(x):
    if x == 1:
        return 10
    else:
       return 20

print check(1) // Prints 10
print check(3) // Prints 20

我希望你理解我的问题。

谢谢。

4 个答案:

答案 0 :(得分:6)

以下是评估fact(5)时堆栈的样子:

fact(5) = 5 * fact(4)
  fact(4) = 4 * fact(3)         
    fact(3) = 3 * fact(2)
      fact(2) = 2 * fact(1)
        fact(1) = 1 * fact(0)
          fact(0) = 1
          # no more recursive calls, unwind the stack
        fact(1) = 1 * 1 = 1
      fact(2) = 2 * 1 = 2
    fact(3) = 3 * 2 = 6
  fact(4) = 4 * 6 = 24
fact(5) = 5 * 24 = 120

希望它有所帮助。每个缩进都是fact(N)返回的内容。

答案 1 :(得分:4)

你自己回答了这个问题

其他部分:

UPDATE ospos_items
SET item_number = CONCAT('babes', item_id)
WHERE item_number IS NULL OR item_number = 'NULL'

,然后

5 * fact( 4 )

5 * 4 * fact( 3 )

5 * 4 * 3 * fact( 2 )

5 * 4 * 3 * 2 * fact( 1 )

之后它会进入返回1的if部分

5 * 4 * 3 * 2 * 1 * fact( 0 )

所以表达就像这样

if n == 0:
        return 1

= 120

答案 2 :(得分:2)

你已经在问题中提到了答案。让我解释一下。当你这样做时:

if let result = jsonResult, let jsonChildren = result["children"] as? [AnyObject] {
      for jsonChild in jsonChildren {
           let child = Child()
           child.name = jsonEntrance["name"] as! String
           child.age = jsonEntrance["age"] as! Int

           person.children.append(child)
      }
}

这意味着,return n * fact(n-1) " n"乘以return返回的值。所以,在你的最后一步,你提到了:

fact(n-1)

5 * 4 * 3 * 2 * fact( 1 ) 将替换为1,您的fact( 1 )将返回fact,即120

有关详细信息,请参阅:Recursive Functions

答案 3 :(得分:1)

因此,当n == 0 fact返回1时,您的初步理解是正确的。但请考虑将该值返回到的内容:调用fact(0)的分支,即{{ 1}}。 fact(1)然后将fact(1)返回1*1,它会向上爬回,直到您拨打原始电话并收到fact(2)的整体计算。