強制的に効率的な再帰の出てくるに例外をスローしていますか?

ハンドル:

以下は、単に擬似コードです。

  function x(node){
    if(node.val == 42) 
       return true; // What if I throw an exception here ?
    val1 = node.left ? x(node.left) : false ;
    val2 = node.right ? x(node.right): false; 
    return val1 || val2 ;
 }

私は、ツリー内の42を見つけようとしているとしましょう。私は、有効な値を返す場合は、上記のコードでは、それがバブルアップ全体の再帰チェーンへ、その後は最終的に返されます。

私はだけではなく、3行目で真返すので、それは実際に直接再帰チェーンを通じバブルアップとは、呼び出し元には戻りません例外をスローした場合、私の仮定があります。

それだけで全体のチェーンを破るために例外をスローすることをお勧めします。原因は、sがで言わせてline 4、それはいくつかのネストされたスタック内の42を発見したと、それはまだで再帰を追求していきますline 5私はちょうどで例外をスローした場合line 3、我々はその不要な計算を回避することができます。

私は、未処理の例外がスローされます、それはまだバブルアップ(このアプローチの無意味になります)再帰スタックへの直接の親呼び出しのプログラム・カウンタに復帰した場合の質問は、複数の内部コンパイラのです。

templatetypedef:

私はいくつかの異なった理由のために再帰チェーンを破るために例外を投げることをお勧めしません。

  • 効率性例外をスローすることは一般的に、関数からの復帰よりもはるかに遅く、話す、です。例外がスローされたときに具体的に、ランタイムは現在のスタックトレースと例外を移入する必要があり、検索するために必要呼び出すためにどのハンドラ、見て見てする必要がありますfinally実行するためのブロックやtryゴミのオブジェクト参照を追跡し、-with-リソース文収集の目的、などそれはまだコールスタック、コールチェーン最大値を返すでしょう、そして、ほぼ確実に何らかの速く、より標準的なアプローチよりもするつもりはないと同じように歩く必要です。

  • ユーザビリティあなたは再帰的なチェーンを中止する例外をスローした場合、誰がその例外に反応することを書き込みコードにあなたの関数のニーズを呼び出します。代わりに、書き込みのようなものをやってのこの手段if (myCall()) {...}、彼らは、呼び出しは、それがスローケースのために、通常は一つの値を返す場所のための1つを別々の枝を持っている必要があります。彼らはこれを行うには忘れてしまった場合は、実行時にコードが、実際に実際に期待通りに動作していたときに例外による失敗しているように見えるかもしれません。物事を悪化させる、あなたが実際にされるだろう、反転例外の通常の使用を。あなたのコードが例外をスローした場合、それは時に成功し、それは時に値を返す失敗します、誰でも自分のコードを読み取ることはおそらく行くために起こっている「ハァッの?」少なくとも、あなたが何を意味するかを考え出す前に一度。

  • クラリティ例外は、まあ、例外的な状況のために使用されるようになっています!例外メカニズムは、値を返すために実現可能な方法は、単純にありません場合は、バックの情報を報告するように設計されています。通常の制御フローを処理するために例外システムを再利用することは読んで維持するために、コード難しくなり、驚きを最小にするという原則に違反します。

使いやすさと明確さ - - まだ強く、このようなことをやっていないの賛成で重量を量るあなたの元の質問は、効率点についてほとんどでしたが、私は他の2つの点があると主張したいです。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=188003&siteId=1