3

Javascript で記述された再帰関数がありますが、過度の再帰が原因で RangeError が発生しています。したがって、トランポリンを使用してテールを最適化しました。これにより、関数呼び出しが while ループにラップされ、RangeError が取り除かれました。ただし、再帰関数内でスローされた例外を処理する必要があります (1 レベル戻って修正処理を行います)。トランポリンを使用しているときに、このような状況に対処する方法がわかりません。

私の元の再帰関数(説明のために簡略化):

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負になり例外がスローされると、直接トランポリン キャッチ ブロックに移動します。しかし、1 レベル上の process() の catch ブロックに戻る必要があります。

どうすればそれを達成できるか提案できますか?ご協力いただきありがとうございます!関連する投稿をいくつかチェックしましたが、必要な解決策がわかりません。

4

0 に答える 0