找回密码
 加入
搜索
查看: 4305|回复: 13

[AU3基础] 为什么这个值不是预想的那样

 火.. [复制链接]
发表于 2012-10-30 20:11:19 | 显示全部楼层 |阅读模式
#include <array.au3>
        Local $m
        Global $b=0
        $m=xfor(5)
        Func xfor($n)
                
                If $n<1 Then
                        Return $b
                Else
                        $b=$b+$n
                        xfor($n-1)
                EndIf
        EndFunc
    MsgBox(0,"m的值是",$m)
为什么这个$m的值是0,而不是15呢?
发表于 2012-10-30 20:27:57 | 显示全部楼层
$m == 0那是因为函数的默认返回值就是0,你没有发现你的函数除了n==1外其他的都咩有返回值吗?
加一个return就可以了
#include <array.au3>
        Local $m
        Global $b=0
        $m=xfor(5)
                MsgBox(0,"m的值是",$m)

        Func xfor($n)
                If $n<1 Then
                        Return $b
                Else
                        $b=$b+$n
                        Return xfor($n-1)
                EndIf
        EndFunc

评分

参与人数 1金钱 -20 收起 理由
user3000 -20 太不没认真看贴出来的代码了!

查看全部评分

发表于 2012-10-30 21:26:27 | 显示全部楼层
回复 2# seeyou


人家本来是递归调用的,只有$n<1才返回。你倒好,加个return直接给他返回了, Org ...

楼主:一般主体语句写在前面,函数定义在后,把MsgBox提到前面来吧
发表于 2012-10-30 21:35:10 | 显示全部楼层
回复  seeyou


人家本来是递归调用的,只有$n
xiehuahere 发表于 2012-10-30 21:26


唉,从哪里说起呢?
递归的精髓都在对return的把握,程序要在实践中得真知。
PS:函数的前后只是格式问题。
发表于 2012-10-30 22:55:44 | 显示全部楼层
本帖最后由 annybaby 于 2012-10-30 22:57 编辑

回复 1# sanye000001

函数的默认返回值是0啊,你调用的函数中,只有参数小于1时才有设置返回值,并且此时返回的又是你前面定义并赋值的$b=0,也就是说,不管参数如何,你的代码运行的返回值都是0,你是想计算1+2+3+...+$n的和吧??它的结果放在变量$b中啊~
故你应该显示的值是$b,而不是$m

另外,为什么要#include <array.au3>呢??你的代码中并没有用到数组相关的自定义函数啊,这样只会增加函数的体积
发表于 2012-10-30 23:26:43 | 显示全部楼层
本帖最后由 xiehuahere 于 2012-10-30 23:29 编辑

回复 4# seeyou


嗯,运行了下,你的代码是对的,只是我不习惯这样的代码。
我喜欢这样的:
Global $b = 0
Local $m = xfor(5)
MsgBox(0, "m的值是", $m)
 
Func xfor($n)
        If $n < 1 Then Return ;递归结束的条件
        $b += $n
        xfor($n - 1)
        Return $b ;最终要的值
EndFunc   ;==>xfor


递归最重要的是要设置好退出条件并最终返回你要的值, return太多真的会搞混
发表于 2012-10-30 23:31:30 | 显示全部楼层
回复 6# xiehuahere

那不是我的风格,我只是在楼主的代码里改改。其实做清晰的写法还是:
Func xfor($n)
        If $n==1 Then
                        Return 1
        EndIf
        Return $n + xfor($n-1)
EndFunc

评分

参与人数 4金钱 +90 收起 理由
user3000 + 40 汗,原来还是我错了, 补上并加点分!
annybaby + 20 非常精彩~~简洁
3mile + 20 解释仔细
xiehuahere + 10 学习了~

查看全部评分

发表于 2012-10-30 23:39:01 | 显示全部楼层
回复 7# seeyou

嗯,这种是最简洁的。
下次如果看楼主代码不顺眼,还有劳多费点心,让我等也学习下 ^_^
发表于 2012-10-30 23:42:25 | 显示全部楼层
回复 7# seeyou


    这种风格我喜欢~~
发表于 2012-10-30 23:44:52 | 显示全部楼层
回复 8# xiehuahere

实在是太客气了,还劳你加分,呵呵。
发表于 2012-10-31 00:18:38 | 显示全部楼层
回复 7# seeyou

首先,兄台的解释很仔细,帮助坛友了解递归的原理.
但既然是在科普,不妨解释的更清晰些.
可惜我的语言能力有限,不能准确的表达.仅以代码解释吧
1,RETURN 1不如改成SETERROR
2,递归在AU3中的层级好像只有1898,否则出错.
Local $m
$m = xfor(1898);可以测试下值为0,为1,为1900时的结果.
If @error then 
        MsgBox(0,"@error",@error)
Else
        MsgBox(0, "m的值是", $m)
EndIf

Func xfor($n)
        If $n<1 Then Return SetError(1,1,0)
        Return $n + xfor($n-1)
EndFunc


鉴于递归时层级有限,做大量递归时不防试用循环来代替递归,以免出错.
Local $n=10000
Local $b=0

While $n>0
                $b+=$n
                $n-=1
WEnd
MsgBox(0,0,$b)


以上仅为我知道的东西而言,希望能钓来大鱼能解释得更清楚.

评分

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

查看全部评分

发表于 2012-10-31 00:33:51 | 显示全部楼层
回复 11# 3mile

测试了下 3898层可以
 楼主| 发表于 2012-11-1 10:18:40 | 显示全部楼层
谢谢大家的耐心解答,受教了
发表于 2012-11-1 12:52:03 | 显示全部楼层
递归使用还是不怎么习惯,还是For通俗易懂!
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-5-20 06:03 , Processed in 0.098361 second(s), 30 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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