chamlien 发表于 2016-6-29 13:16:40

【已解决】以一个简单的函数请教一下递归的执行顺序

本帖最后由 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次递归后面的语句呢?

kk_lee69 发表于 2016-6-29 13:24:59

回复 1# chamlien


    函數裡面 套嵌 函數    應該最等最裡面的函數 跑完 在一層一層 返回吧


最裡面A=3所以先跑 IF然後結束

然後 跑 倒數 第二層的 後面
倒數 第一層
然後結束呀

chamlien 发表于 2016-6-29 16:08:33

本帖最后由 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

heroxianf 发表于 2016-6-29 16:30:04

这个要留名学习一下~

kk_lee69 发表于 2016-6-29 16:31:49

本帖最后由 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

chamlien 发表于 2016-6-29 16:55:12

回复 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

这样的理解差不多了没,不过自己老是觉得挺绕的。

nmgwddj 发表于 2016-6-29 16:59:54

理解递归最好的方式就是把它拆成多个函数。

kk_lee69 发表于 2016-6-29 17:11:01

回复 7# nmgwddj

酷!!!圖片表示的真清楚

heroxianf 发表于 2016-6-29 17:22:05

回复 7# nmgwddj


    线条很是清楚 回去好好研究一下。

chamlien 发表于 2016-6-29 17:29:02

5楼7楼的解答本质是一样的,我已经理解了,谢谢二位的帮忙!

mysiap 发表于 2016-6-30 11:36:40

圖片解釋真是一目了然…{:1_578:}

zhzhtx 发表于 2016-11-22 20:58:45

感觉大脑不太够用呀
页: [1]
查看完整版本: 【已解决】以一个简单的函数请教一下递归的执行顺序