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