我有一个用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)
我使用trampolining(ref:Understanding recursion in functional JavaScript programming)
更新了递归函数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
变为负数并抛出异常时,我直接进入trampoline catch块。但我需要回到进程()的catch块一级。
您能否建议我如何实现这一目标?谢谢你的帮助!我查看了一些相关的帖子,但无法找出我需要的解决方案。