我有一个用 Javascript 编写的递归函数,由于过度的深度递归,它给出了 RangeError。因此,我使用蹦床对其进行尾部优化。这已将函数调用包装在一个 while 循环中,并且我已经摆脱了 RangeError。但是我需要在递归函数中处理抛出的异常(返回一级并进行一些纠正处理)。在使用蹦床时,我不确定如何处理这种情况。
我原来的递归函数(为了说明而简化):
function process (val, level){
if(val < 0 ){
throw new negativeException(val);
}
for(var i=0; i< num; i++){
try{
//do some processing on val
process (val, level+1);
return;
}
catch(e){
//do some different processing on val and use i as well
}
}
}
function process (val, level)
我使用蹦床更新的递归函数(参考:了解函数式 JavaScript 编程中的递归)
function trampoline(f) {
try{
while (f && f instanceof Function) {
f = f();
}
} catch(e) {
//catching exception in trampoline
}
return f;
}
function callProcess(val, level){
function process(val, level){
if(val < 0 ){
throw new negativeException(val);
}
for(var i=0; i< num; i++){
try{
//do some processing on val
return process.bind(null, val, level+1); /updated recursive call
}
catch(e){
//do some different processing on val and use i as well
}
}
}
return trampoline(process.bind(null, pstate,level));
}
function callProcess(val, level)
使用更新的代码,只要val
不是负数并且没有引发异常,我就可以避免 RangeError。但是当val
结果为负并抛出异常时,我将直接进入蹦床捕获块。但是我需要回到上一层的 process() 的 catch 块。
你能建议我如何做到这一点吗?谢谢你的帮助!我查看了一些相关的帖子,但无法找出我需要的解决方案。