【已解决】以一个简单的函数请教一下递归的执行顺序
本帖最后由 chamlien 于 2016-6-29 17:27 编辑;测试递归的执行顺序
_digui(0)
Func _digui($a)
If $a==3 Then
ConsoleWrite("这是IF里面的语句" & @CRLF)
Return -1
EndIf
_digui($a+1)
ConsoleWrite("这是递归后面的语句" & @CRLF)
Return 1
EndFunc
#cs --------上方代码输出结果是-----------
这是IF里面的语句
这是递归后面的语句
这是递归后面的语句
这是递归后面的语句
------------------------------------- #ce
上方代码,个人以为输出的顺序结果应该是:
这是递归后面的语句
这是递归后面的语句
这是递归后面的语句
这是IF里面的语句
所以为什么是先执行If里面的语句后,再执行3次递归后面的语句呢? 回复 1# chamlien
函數裡面 套嵌 函數 應該最等最裡面的函數 跑完 在一層一層 返回吧
最裡面A=3所以先跑 IF然後結束
然後 跑 倒數 第二層的 後面
倒數 第一層
然後結束呀 本帖最后由 chamlien 于 2016-6-29 16:30 编辑
回复 2# kk_lee69
这个层是怎么知道的,能否画个关系图?加了一句输出$a,a的值输出顺序是0,1,2,说明不是先执行0,1,2吗,怎么先执行a=3了呢?
;测试递归的执行顺序
_digui(0)
Func _digui($a)
If $a==3 Then
ConsoleWrite("这是IF里面的语句" & @CRLF)
Return -1
EndIf
ConsoleWrite($a & @CRLF)
_digui($a+1)
ConsoleWrite("这是递归后面的语句" & @CRLF)
Return 1
EndFunc
#cs --------上方代码输出结果是-----------
0
1
2
这是IF里面的语句
这是递归后面的语句
这是递归后面的语句
这是递归后面的语句
--------------------------------------
#ce 这个要留名学习一下~ 本帖最后由 kk_lee69 于 2016-6-29 16:33 编辑
回复 3# chamlien
你的意思 不就等同 下面語法的套圈模式
P.S 意義上是一樣的
Func _digui($a) ; $a=0
If $a==3 Then
ConsoleWrite("?是IF里面的?句" & @CRLF)
Return -1
EndIf
Func _digui($a) ;$a=1
If $a==3 Then
ConsoleWrite("?是IF里面的?句" & @CRLF)
Return -1
EndIf
Func _digui($a) ;$a=2
If $a==3 Then
ConsoleWrite("?是IF里面的?句" & @CRLF)
Return -1
EndIf
Func _digui($a); $a=3
If $a==3 Then
ConsoleWrite("?是IF里面的?句" & @CRLF)
Return -1;這邊一定會返回所以 下面語句沒用了
EndIf
_digui($a+1)
ConsoleWrite("?是??后面的?句" & @CRLF)
Return 1
EndFunc
ConsoleWrite("?是??后面的?句" & @CRLF)
Return 1
EndFunc
ConsoleWrite("?是??后面的?句" & @CRLF)
Return 1
EndFunc
ConsoleWrite("?是??后面的?句" & @CRLF)
Return 1
EndFunc
回复 5# kk_lee69
有点明白了,结合你提供的代码,我又加了一行,得出了测试结果:
;测试递归的执行顺序
_digui(0)
Func _digui($a)
If $a==3 Then
ConsoleWrite("这是IF里面的语句" & @CRLF)
Return -1
EndIf
ConsoleWrite($a & @CRLF)
_digui($a+1)
ConsoleWrite("这是递归后面的语句:" & $a &@CRLF)
Return 1
EndFunc
输出的结果是:
0
1
2
这是IF里面的语句
这是递归后面的语句:2
这是递归后面的语句:1
这是递归后面的语句:0
也就是说,调用digui(a+1)的时候,每次执行到digui(a+1),那么digui(a+1)后面的语句都暂时未被执行
直到a+1=3满足了跳出条件,也即退出了digui(a+1)这个语句,这时digui(a+1)后面的语句才得以执行,因此后面的a顺序是2,1,0
这样的理解差不多了没,不过自己老是觉得挺绕的。 理解递归最好的方式就是把它拆成多个函数。
回复 7# nmgwddj
酷!!!圖片表示的真清楚 回复 7# nmgwddj
线条很是清楚 回去好好研究一下。 5楼7楼的解答本质是一样的,我已经理解了,谢谢二位的帮忙! 圖片解釋真是一目了然…{:1_578:} 感觉大脑不太够用呀
页:
[1]