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
我希望你理解我的问题。
谢谢。
答案 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)
的整体计算。