错误方法:用“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
t.push(pre[i]);
}
t.push(nex[0]);
returninfo.appendText("\n"+pc(t));//用return阻止并返回一个值,但所谓的阻止只是截断了当前的层返回了上层。问题是:返回上层后,递归还在继续进行,没有及时退出循环并进入主程序。这不是我们想要的…………………
}
for (var k:uint=0;k
varp:Array=pre.slice();
vars:Array=nex.slice();
p.push(s.splice(k,1));
arr_all(p,s);//递归…………………
}
}
运行结果:图1
递归函数为我们找到了所有的符合条件的结论。而我们只需要第一个,找到了就退出递归。看来,return只是返回了当前循环层的值并往上一层返回。并没有终止递归继教。所以这个方法是错误的。