win7 + Flash cs5.5 + as3.0
错误方法:用“return值”退出循环。 由于递归的调用是层层嵌套的,所以用return返回时需要一层一层逐级向上返回。换句话说,在return之后,只能确保截断当前层的循环,不能终止递归循环。因主它返回到上一层之后还要在上一层上沿其它“分枝”(树的节点)继续往下递归。 示例: //功能:数组元素全排列 //参数pre:数组型,初始为空,用来存放结果 //参数nex:数组型,初始为原始数组 function arr_all(pre:Array,nex:Array) { varj:uint=nex.length; if (j==1) {//满足设定的条件后, var t=[]; for (vari:uint=0; i
无效应用:增加一个标志性参数。 尝试一下在函数的参数中增加一个标志性的参数,初始化时为真,意思是可以继续循环,当满足条件后再设标志参数为假,再用判断语句结合返回语句阻止循环的继续。主意不错,我们试下: 还是上面的全排列函数: function arr_all(pre:Array,nex:Array, logo:Boolean =true) { varj:uint=nex.length; if (j==1) { var t=[]; for (vari:uint=0; i
正确方法:使用位高权重的全局变量! 我们不得不换个思路,既然在递归函数的内部无法实现想法,那么我们就把目光移到函数体外,另辟蹊径: 首先,在递归函数之外定义一个全局变量:isGo,布尔型,初始值为真,意思是可以继续循环。 接着,在递归循环的一开始就设置判断机制,一旦isGo的值为假,就层层阻止,直到退出所有层的循环,从而达到强制退出递归的目的。 if(isGo==false){ return } 最后,在递归的“满足条件”代码中增加如下语句: isGo =false; 下面给出修改后的代码: var isGo:Boolean=true functionarr_all(pre:Array,nex:Array) { if(isGo==false){return} var j:uint=nex.length; if (j==1) { var t=[]; for (var i:uint=0;i
题外话:虽然还有别的办法,如:在满足条件后故意抛出一个异常让程序捕捉,从而强制退出循环,这个不仅麻烦而且运行起来格外耗费资源。另:Break和continue都是循环体内部语句,有阻止和跳过的功能,但权力有限,只对循环体起作用,而对函数体无可奈何。所以强制退出递归循环正宗的,标准的方法是:使用(外部变量isGo ) + (返回语句return)。