怎样强制退出递归函数

2025-10-31 18:46:30

1、错误方法:用“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<pre.length; i++) {

  t.push(pre[i]);

  }

  t.push(nex[0]);

  returninfo.appendText("\n"+pc(t));//用return阻止并返回一个值,但所谓的阻止只是截断了当前的层返回了上层。问题是:返回上层后,递归还在继续进行,没有及时退出循环并进入主程序。这不是我们想要的…………………

  }

  for (var k:uint=0;k<j; k++) {

  varp:Array=pre.slice();

  vars:Array=nex.slice();

  p.push(s.splice(k,1));

  arr_all(p,s);//递归…………………

  }

  }

  运行结果:图1

    

  

  递归函数为我们找到了所有的符合条件的结论。而我们只需要第一个,找到了就退出递归。看来,return只是返回了当前循环层的值并往上一层返回。并没有终止递归继教。所以这个方法是错误的。

怎样强制退出递归函数

2、无效应用:增加一个标志性参数。

  尝试一下在函数的参数中增加一个标志性的参数,初始化时为真,意思是可以继续循环,当满足条件后再设标志参数为假,再用判断语句结合返回语句阻止循环的继续。主意不错,我们试下:

  还是上面的全排列函数:

  function arr_all(pre:Array,nex:Array, logo:Boolean =true) {

  varj:uint=nex.length;

  if (j==1) {

  var t=[];

  for (vari:uint=0; i<pre.length; i++) {

  t.push(pre[i]);

  }

  t.push(nex[0]);

  logo=false//满足条件后,改变标志的值

  returninfo.appendText(pc(t)+"\n");//.....out..............

  }

  if (logo =false){return}//用判断语句进行阻止

  

  for (var k:uint=0;k<j; k++) {

  varp:Array=pre.slice();

  vars:Array=nex.slice();

  p.push(s.splice(k,1));

  arr_all(p,s,true);

  }

  }

  运行结果叫人大失所望:图2  

    

    

  问题还没解决。看来这个方法说得通,行不通。  

怎样强制退出递归函数

3、正确方法:使用位高权重的全局变量!

  我们不得不换个思路,既然在递归函数的内部无法实现想法,那么我们就把目光移到函数体外,另辟蹊径:

  首先,在递归函数之外定义一个全局变量: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<pre.length; i++) {

  t.push(pre[i]);

  }

  t.push(nex[0]);

  isGo =false;

  returninfo.appendText("\n"+pc(t));//..out........

  }

  for (var k:uint=0; k<j; k++) {

  var p:Array=pre.slice();

  var s:Array=nex.slice();

  p.push(s.splice(k,1));

  arr_all(p,s);

  }

  }

  测试结果叫人心花怒放。图3:

    

  本教程要传授的经验是:要想强制退出递归循环,可以通过一个外部变量来实现,只要满足条件就改变这个变量的值,只要这个变量的值变了就层层阻止循环,直到退出递归函数!  

  来自实践的体会,绝对原创的经验。  

     作者:张志晨

      2012.5.5

怎样强制退出递归函数

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢