我有一个自我调用的递归函数。但是我想在某种情况下停止它,比如休息,当然它不是一个循环所以我不能使用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标志时,我可以打破首次调用此函数的循环。
谢谢大家!
答案 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'