3

我有一个用 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 块。

你能建议我如何做到这一点吗?谢谢你的帮助!我查看了一些相关的帖子,但无法找出我需要的解决方案。

4

0 回答 0