请问当(主函数包含了函数本身(嵌套函数?)),此时的函数是如何运作的?[已解决]
本帖最后由 Huiseyu 于 2016-11-28 20:24 编辑以下函数的是如何运作的?下面的代码是我自己从C#资料上尝试转换成了AU3,在这里我理解的函数是
结构:主函数+一个可有可无的参数+代码片段+一个返回值
实现:完成一次(在没有循环的情况下,仅一次)函数的调用 ?? (疑问点1)
....我不理解的是:
请问,在以下代码中如何查看这个函数是如何在运行,就是说这个函数究竟是怎么实现这个算法的(疑问点2)
有点晕,AU3还是有想象不到的地方..很想搞明白,,
不知道有没有描述清楚我的问题,尽力了,还有没睡的吗 __ __# {:face (190):}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 )) 本帖最后由 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 首先观察出规律,否则后面就一头雾水,反之,要看懂很容易:
从第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] =
For $ix = 2 To $nMax
$aN[$ix] = $aN[$ix - 1] + $aN[$ix - 2]
Next
_ArrayDisplay($aN) 那么晚了还在帮助网友,感谢,辛苦了...
for next的实现的确比1楼的代码快了N倍..
针对1楼的代码,还有一个疑问:
函数调用自身的同时没有给条件那么 “1楼的代码是如何停止的..”
烦请有空闲的时间帮忙再想想...{:face (468):} 回复 4# Huiseyu
仔细理解我上面说的“再从最里层(计算到第1位时)逐一返回到最外层(计算到第30位时)”,最外层都已返回即为全部执行完成,停止了。
页:
[1]