2017-08-13 5 views
3

私はMartin Oderskyのscala bookを使っていました。このコードでは第10章(組成物および継承)では:nEdgesは、反復ごとにデクリメントしつつある、Scalaの本からのスカラ再帰の説明

val sp = spiral(nEdges - 1, (direction + 3) % 4) 

私の理解にAccoording:

def spiral(nEdges: Int, direction: Int): Element = { 
    if (nEdges == 1) { 
     elem("+") 
    } 
    else { 
     println(s"nEdgesInside1=$nEdges") 

     val sp = spiral(nEdges - 1, (direction + 3) % 4) 

     def verticalBar = elem('|', 1, sp.height) 

     def horizontalBar = elem('-', sp.width, 1) 

     println(s"nEdgesInside2=$nEdges") 

     if (direction == 0) 
     (corner beside horizontalBar) above (sp beside space) 
     else if (direction == 1) 
     (sp above space) beside (corner above verticalBar) 
     else if (direction == 2) 
     (space beside sp) above (horizontalBar beside corner) 
     else 
     (verticalBar above corner) beside (space above sp) 
    } 
    } 

私はコードがラインを超えてどのように流れるかを理解することができませんspiral関数が呼び出され、1に達すると(つまり終了条件)、elem関数を介してオブジェクトが作成されます。

このコードをテストしてnEdgesの値を印刷すると、それはspiralの上の行が機能するまで減少し、その行の後でインクリメントを開始します。誰が私にこのことが起こっているか説明することができますか?

ありがとうございます。

答えて

3

これは基本的に再帰の仕組みです。 edgesは1になるまでデクリメントされ、それを実行している間に、nEdgesdirectionという独自の値を持つスタックフレームをさらに生成するspiralを呼び出し続けます。 1に達すると、コールスタックが巻き戻しを開始し、古いスタックフレームが破棄されます。これは、これらの2つのフィールドの値が小さいほど、値が高いスタックフレームよりも高い値の代わりに破棄されることを意味します。

nEdgesためnスタンドは、あなたがそれをデクリメントだことを見ることを想像して -

Factorial recursive

http://jade-cheng.com/hpu/2012-spring/csci-2912/recursion/©陳玉ジェイド。):

は例えば、再帰的な階乗計算のこの画像を撮ります各メソッド呼び出しで、n = 0の場合は、スタックを上げて上位に移動し、nの値が大きいスタックを上にします。

関連する問題