2013-11-09 52 views
1

我是Scala的新手,我必須編寫包含內部函數的示例代碼。例如,下面給出了這個函數,我明白,當fib被執行時,它立即執行最後一行,即fibS(x,0,1),但是當這個函數停止時我不會得到,因爲如果返回z,wouldn'程序再次調用fibS(x,0,1)?由於在Scala中調用內部函數

def fib(x: Long): Long = { 
def fibS(i: Long, z: Long, y: Long): Long = {  
    if (i > 0) 
    fibS(i-1, z+y, z) 
    else z 
} 
fibS(x, 0, 1) 
} 
+2

此代碼不正確 - 它甚至沒有編譯,因爲從未定義過「z」。我認爲你的意思是用'z'表示'x'。 – ghik

+0

是的,這是一個錯字 – user2947615

+0

我不明白在這裏投票的原因...... – pedrofurla

回答

2

Scala的定義內的方法是一個範圍的問題,所以當你從fibfibS然後調用一個函數一次,一個遞歸函數,是從其他功能隱藏,因爲它是在fib函數中定義。

如果你在外面移動fibS那麼你會得到相同的結果。

+0

所以當遇到返回z時,外部方法fib將會被終止? – user2947615

+0

是的,當fibS結束時,fib將返回結果 – barczajozsef

0

一個小例子。假設你有功能ab和另一個callBoth

def a = { ... } 
def b = { ... } 
def callBoth = { 
    a; 
    b; 
} 

當您撥打a會發生什麼情況?當你致電b會發生什麼?

答:

  • a執行和a後程序流繼續。
  • b被執行且程序流程在b之後繼續。
  • b之後,它恰好是callBoth的返回,意思是程序流將在所有調用callBoth之後繼續。

fibS一樣,只是它是一個單一的函數調用。在上面的例子中,單獨調用a不會觸發b。因此,在呼叫後返回fibS