sanye000001 发表于 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呢?

seeyou 发表于 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

xiehuahere 发表于 2012-10-30 21:26:27

回复 2# seeyou


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

楼主:一般主体语句写在前面,函数定义在后,把MsgBox提到前面来吧

seeyou 发表于 2012-10-30 21:35:10

回复seeyou


人家本来是递归调用的,只有$n
xiehuahere 发表于 2012-10-30 21:26 http://www.autoitx.com/images/common/back.gif

唉,从哪里说起呢?
递归的精髓都在对return的把握,程序要在实践中得真知。
PS:函数的前后只是格式问题。

annybaby 发表于 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>呢??你的代码中并没有用到数组相关的自定义函数啊,这样只会增加函数的体积

xiehuahere 发表于 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太多真的会搞混

seeyou 发表于 2012-10-30 23:31:30

回复 6# xiehuahere

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

xiehuahere 发表于 2012-10-30 23:39:01

回复 7# seeyou

嗯,这种是最简洁的。
下次如果看楼主代码不顺眼,还有劳多费点心,让我等也学习下 ^_^

annybaby 发表于 2012-10-30 23:42:25

回复 7# seeyou


    这种风格我喜欢~~

seeyou 发表于 2012-10-30 23:44:52

回复 8# xiehuahere

实在是太客气了,还劳你加分,呵呵。

3mile 发表于 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)

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

annybaby 发表于 2012-10-31 00:33:51

回复 11# 3mile

测试了下 3898层可以

sanye000001 发表于 2012-11-1 10:18:40

谢谢大家的耐心解答,受教了

xms77 发表于 2012-11-1 12:52:03

递归使用还是不怎么习惯,还是For通俗易懂!
页: [1]
查看完整版本: 为什么这个值不是预想的那样