如何停止函数递归

时间:2015-07-22 11:23:57

标签: javascript

我有一个自我调用的递归函数。但是我想在某种情况下停止它,比如休息,当然它不是一个循环所以我不能使用break。有什么方法吗?谢谢

这里的功能,你可能会看到一个休息,那就是我想要停止功能回忆的时候。谢谢!

function generateParseTree(parsingArray, left, right, rootIndex) {
    probability *= parsingArray[left][right][rootIndex].prob;
    if (!parsingArray[left][right][rootIndex]['divide']) {
        if (left == parsingArray.length - 2 && right == parsingArray.length - 1) {
            if (probability > 1e-6) {
                suming ++;
                break;
            }
            return;
        } else {                    
            return;
        }
    }
    generateParseTree(parsingArray, left, parsingArray[left][right][rootIndex]['divide'], parsingArray[left][right][rootIndex]['right1Index']);
    generateParseTree(parsingArray, parsingArray[left][right][rootIndex]['divide'], right, parsingArray[left][right][rootIndex]['right2Index']);
        return;

}

更新 -----------------------------------

抱歉,我的逻辑有点乱,函数被多次调用,并且在每次递归中可能会出现可能中断的情况。我想要的是,它第一次到达停止状态时,所有的递归都停止了。

解决方案 -----------------------------------

我使用try catch来实现我的设计,break被替换为throw "flag",这样,当我捕获throwed标志时,我可以打破首次调用此函数的循环。

谢谢大家!

6 个答案:

答案 0 :(得分:1)

由于你已经在代码中返回了我假设你知道你可以在那时从函数返回。

你可以返回一个值,这意味着其他地方的东西。

您想要的功能几乎(或是)goto。

因此,由于异常与gotos非常相似,因此可以通过在事件发生时抛出异常来实现类似以下的方法。

function generateParseTree(parsingArray, left, right, rootIndex) {
   try
    {
        probability *= parsingArray[left][right][rootIndex].prob;
        if (!parsingArray[left][right][rootIndex]['divide']) {
            if (left == parsingArray.length - 2 && right == parsingArray.length - 1) {
                if (probability > 1e-6) {
                    suming ++;
                    throw "this thing is done";
                }
                return;
            } else {                    
                return;
            }
        }
        generateParseTree(parsingArray, left, parsingArray[left][right][rootIndex]['divide'], parsingArray[left][right][rootIndex]['right1Index']);
        generateParseTree(parsingArray, parsingArray[left][right][rootIndex]['divide'], right, parsingArray[left][right][rootIndex]['right2Index']);
        return;
      }
      catch (err)
      {
           console.log(err); // "this thing is done"
      }
    }

答案 1 :(得分:0)

你不能只从return放置break吗?

答案 2 :(得分:0)

您可以更改功能以返回表示是否继续的值。在再次调用该函数时,只需检查返回的值,然后再继续。

<script>
function f(){
  // your code here
  if(breakTheCode){
    return -1;
  }
  if(f()==-1){ // recursion
    return -1;
  }
  return 1;
}
</script>

答案 3 :(得分:0)

为什么不使用return而不是break?

答案 4 :(得分:0)

通常如果你只是写driver.get("http://www.mortgagecalculator.org/"); driver.findElement(By.xpath(".//*[@id='calc']/form/section/section[2]/div/div/div[1]/div/div/div[3]/div[1]/div[1]/div[4]/a/strong/font")).click(); Thread.sleep(3000); driver.switchTo().frame("brbodxlxcs"); Thread.sleep(4000); System.out.println("***"); driver.findElement(By.xpath(".//*[@id='brTabbedRateTable']/div[1]/form[2]/div/div[3]/div[1]/ul/li[1]/input")).click(); driver.findElement(By.xpath(".//*[@id='brTabbedRateTable']/div[1]/form[2]/div/div[3]/div[2]/ul/li[8]/a")).click(); Thread.sleep(2000); ,它应该突破该函数并返回一个return对象。

答案 5 :(得分:0)

您可以使用'return'代替'break'