1

私は階層データ構造で何かをしており、以下で説明するように、間接再帰でそれをトラバース/分析するためのメソッドのグループを設計しました。

メソッドabc、およびがありd、すべてUnit戻り値の型があります。メソッドaが最初に呼び出されます。データに応じて、何かを実行してから停止するか、いずれかを呼び出しますb/c/d。b、c、および d のそれぞれについても同じです。各メソッドは、停止するか、他の 3 つのメソッドのいずれかを呼び出すことができます。そのため、どのメソッドが呼び出され、その実行順序は実行時まで不明であり、メソッド自体を直接呼び出すメソッドはないため、再帰は直接明らかではありません (心配しないでください。すべてのメソッドは、呼び出します)。

abc、またはへの追加の各呼び出しdは、各メソッドで最後に実行されますが、文字通り各メソッドの最後のステートメントではありません。どちらが呼び出されるかを制御するiforcaseステートメントがあります。

どのメソッドも自分自身を直接呼び出していない場合、Scala コンパイラはこの多層呼び出しチェーンを分析し、末尾再帰を実装できますか?

4

2 に答える 2

4

いいえ、Scala はそのような末尾呼び出しの最適化を実行できません。JVM は実際にはこれを可能にしません (少なくとも簡単ではありません)。

ただし、引数に応じて 4 つの異なるパスを取ることができる 1 つの関数を作成することで、自分でそれを模倣できます。(コンパイラがあなたを助けるなら、それはこのようなことをしなければならないでしょう。)

于 2012-03-15T19:34:29.970 に答える
1

コンパイラは自動的にそれを行うことはできませんが、ユースケースは使用しやすいはずscala.util.control.TailCallsです。

ただし、それはあまりパフォーマンスが高くないため、呼び出しが 4 深度しかない場合は、それだけの価値がない可能性があります。

于 2012-03-16T05:51:59.673 に答える