找回密码
 加入
搜索
查看: 3090|回复: 11

[效率算法] 【已解决】以一个简单的函数请教一下递归的执行顺序

  [复制链接]
发表于 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次递归后面的语句呢?
发表于 2016-6-29 13:24:59 | 显示全部楼层
回复 1# chamlien


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


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

然後 跑 倒數 第二層的 後面
倒數 第一層
然後結束呀
 楼主| 发表于 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
发表于 2016-6-29 16:30:04 | 显示全部楼层
这个要留名学习一下~
发表于 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

评分

参与人数 1金钱 +10 收起 理由
chamlien + 10

查看全部评分

 楼主| 发表于 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

这样的理解差不多了没,不过自己老是觉得挺绕的。
发表于 2016-6-29 16:59:54 | 显示全部楼层
理解递归最好的方式就是把它拆成多个函数。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?加入

×

评分

参与人数 1金钱 +10 收起 理由
chamlien + 10 谢谢帮忙

查看全部评分

发表于 2016-6-29 17:11:01 | 显示全部楼层
回复 7# nmgwddj

酷!!!  圖片表示的真清楚
发表于 2016-6-29 17:22:05 | 显示全部楼层
回复 7# nmgwddj


    线条很是清楚 回去好好研究一下。
 楼主| 发表于 2016-6-29 17:29:02 | 显示全部楼层
5楼7楼的解答本质是一样的,我已经理解了,谢谢二位的帮忙!
发表于 2016-6-30 11:36:40 | 显示全部楼层
圖片解釋真是一目了然…
发表于 2016-11-22 20:58:45 | 显示全部楼层
感觉大脑不太够用呀
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-25 12:38 , Processed in 0.076006 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表