为什么这个值不是预想的那样
#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呢? $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
回复 2# seeyou
人家本来是递归调用的,只有$n<1才返回。你倒好,加个return直接给他返回了, Org ...
楼主:一般主体语句写在前面,函数定义在后,把MsgBox提到前面来吧 回复seeyou
人家本来是递归调用的,只有$n
xiehuahere 发表于 2012-10-30 21:26 http://www.autoitx.com/images/common/back.gif
唉,从哪里说起呢?
递归的精髓都在对return的把握,程序要在实践中得真知。
PS:函数的前后只是格式问题。 本帖最后由 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: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太多真的会搞混 回复 6# xiehuahere
那不是我的风格,我只是在楼主的代码里改改。其实做清晰的写法还是:
Func xfor($n)
If $n==1 Then
Return 1
EndIf
Return $n + xfor($n-1)
EndFunc
回复 7# seeyou
嗯,这种是最简洁的。
下次如果看楼主代码不顺眼,还有劳多费点心,让我等也学习下 ^_^ 回复 7# seeyou
这种风格我喜欢~~ 回复 8# xiehuahere
实在是太客气了,还劳你加分,呵呵。 回复 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)
以上仅为我知道的东西而言,希望能钓来大鱼能解释得更清楚. 回复 11# 3mile
测试了下 3898层可以 谢谢大家的耐心解答,受教了 递归使用还是不怎么习惯,还是For通俗易懂!
页:
[1]