递归,按照执行顺序来看就好像是一层又一层的空间,调用自身的地方是入口,条件是出口,当不满足条件时,从出口出去,回到上一层。所以在递归的过程中要搞清楚当前是在哪一层,并且确认当前的参数是什么。
按照 3 层Hanoi 塔来说。
<script>
var Hanoi = function( disc, src, aux, dst){
if (disc>0){
Hanoi(disc - 1, src, dst, aux );
document.writeln(' move disc ' + disc + ' from ' + src + ' to ' + dst + '<br/>');
Hanoi(disc - 1, aux, src, dst );
}
};
Hanoi(3, "SRC", "AUX", "DST")
</script>
(第一层第一个递归调用)3, <span style="font-family: Arial, Helvetica, sans-serif;">SRC</span>, AUX, DST<span style="white-space:pre"> </span><span style="font-family: Arial, Helvetica, sans-serif;">2, SRC, DST, AUX<span style="white-space:pre"> </span>1, SRC, AUX, DST<span style="white-space:pre"> </span>0,SRC, DST, AUX(调用函数,if语句判断不符合,回到上一层继续执行) </span>
<span style="white-space:pre"> </span> <span style="white-space:pre"> </span>2 SRC -> AUX(writeln输出)<span style="white-space:pre"> </span><span style="font-family: Arial, Helvetica, sans-serif;">1 SRC-> DST(执行到writeln输出,再第二个递归调用)</span>
<span style="white-space:pre"> </span>1 DST, SRC, AUX(第二个递归调用)<span style="white-space:pre"> </span>0 ,DST, AUX, SRC(第二个递归里面的第一个递归调用。if 返回)
……示意图画不下去了,就画了前面一部分。横着看,在代码上是往内走。纵着是代码往下走。不知道过半年自己回过头来看还看不看得懂自己画的……