找回密码
 加入
搜索
查看: 1989|回复: 4

[AU3基础] 请问当(主函数包含了函数本身(嵌套函数?)),此时的函数是如何运作的?[已解决]

[复制链接]
发表于 2016-11-27 01:42:29 | 显示全部楼层 |阅读模式
本帖最后由 Huiseyu 于 2016-11-28 20:24 编辑

以下函数的是如何运作的?
下面的代码是我自己从C#资料上尝试转换成了AU3,在这里我理解的函数是
结构:主函数+一个可有可无的参数+代码片段+一个返回值
实现:完成一次(在没有循环的情况下,仅一次)函数的调用 ?? (疑问点1)

....我不理解的是:
请问,在以下代码中如何查看这个函数是如何在运行,就是说这个函数究竟是怎么实现这个算法的(疑问点2)
有点晕,AU3还是有想象不到的地方..很想搞明白,,

不知道有没有描述清楚我的问题,尽力了,还有没睡的吗 __ __# 
global $num=30

func num($i='')
        if $i <=0 then
        return 0
        elseif $i>=0 and $i <=2 then
        return 1
else
;~         consolewrite(Num($i-1)+num($i-2)&@crlf);这里的数字太跳跃了,还是不能理解这个函数是在怎么运作
        return Num($i-1)+num($i-2)

endif
endfunc

global $str='递归算法的经典面试题 ,有一组数1、 1、 2、 3、 5、 8、 13、 21、 34...,要求用递推算法算出这组数的第30个数是多少?'
msgbox(4096 ,'递归第'&$num&'个数的计算结果:'&num($num) ,stringregexpreplace($str,',',','&@crlf ))
 楼主| 发表于 2016-11-27 04:49:22 | 显示全部楼层
本帖最后由 Huiseyu 于 2016-11-27 04:50 编辑
#cs 沙发自己占
桌摸了一会,好像是懂了一点点,下面试着描述一下:

依着逻辑看代码:在表达式的返回值 Num($i-1)+num($i-2) 中,
                                                当执行 if $i <=0 then                        的时候就返回0。
                                                当执行 $i>=0 and $i <=2 then                的时候就返回1。
                                                否则就干脆返回 Num($i-1)+num($i-2),
                                                巧妙在这个最后一次返回,它既是一个返回值,同时又在给主函数Num($i)赋值...
就在这个时候,这个函数的参数$i如同鬼一样开始声东击西四处乱窜了
但它是从哪里如何开始,又从哪里如何结束呢? 额,还是说不清楚,等于没懂...
还请大家点石成金吧...
#ce
发表于 2016-11-28 01:06:08 | 显示全部楼层
首先观察出规律,否则后面就一头雾水,反之,要看懂很容易:
从第2位起,每位都是前1位及前2位的和,即 ($i - 1) + ($i - 2)

这里的递归是直接代入第30位,因前两位未知,因此,它直接代入 Num(30),由内部逐一递归获取前两位的值。标题的问题,所谓的主函数嵌套了自身,实际上就是一次次的将函数自身重复执行,而每次执行自身可能并未立即返回,而是继续调用自身,如此循环,直到符合返回的条件,再从最里层(计算到第1位时)逐一返回到最外层(计算到第30位时)。

此题是指定使用递归算法,但其实Au3的递归的效率是很低的,而一般递归用循环都可实现。个人认为,对于Au3的单线程,循环要可靠、效率高得多。特别是对于指定了循环次数的,用For...Next很简单
#Include <Array.au3>
Local $nMax = 30, $aN[$nMax + 1] = [0, 1]
For $ix = 2 To $nMax
        $aN[$ix] = $aN[$ix - 1] + $aN[$ix - 2]
Next
_ArrayDisplay($aN)
 楼主| 发表于 2016-11-28 08:07:58 | 显示全部楼层
那么晚了还在帮助网友,感谢,辛苦了...
for next的实现的确比1楼的代码快了N倍..
针对1楼的代码,还有一个疑问:
函数调用自身的同时没有给条件那么 “1楼的代码是如何停止的..”
烦请有空闲的时间帮忙再想想...
发表于 2016-11-28 13:37:43 | 显示全部楼层
回复 4# Huiseyu


    仔细理解我上面说的“再从最里层(计算到第1位时)逐一返回到最外层(计算到第30位时)”,最外层都已返回即为全部执行完成,停止了。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

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

GMT+8, 2024-11-21 23:10 , Processed in 0.083125 second(s), 23 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

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