天天看點

泛函程式設計(3)-認識Scala和泛函程式設計

 接着昨天的文章,再示範一個稍微複雜一點的尾遞歸tail recursion例子:計算第n個fibonacci數。fibonacci數第一、第二個數值分别是0,1,按順序後面的數值是前面兩個數的加合。例如:0,1,1,2,3,5...

首先,尾遞歸是指一個遞歸函數最後一個語句獨立引用了自己。在以上的例子裡 go(cnt-1,cur,prev + cur)是最後一條沒有增加任何運算的獨立語句。我們可以試着約化:

正是我們預期的答案。

 scala的函數(function)還是值得提的。函數可以當作标準的對象使用:可以當作另一個函數的輸入參數或者結果值。接受函數作為輸入參數或者傳回另一函數作為結果的函數被稱之為高階函數(high order function)。在scala程式設計裡匿名函數(anonymous function or lamda function)或函數文本(function literal)的使用也很普遍。用書上的代碼樣例來示範:

注意formatresult是一個高階函數,因為它接受一個函數f作為輸入參數。這裡 int => int 是一個類聲明,是個函數的類型。看看高階函數和匿名函數是怎麼使用的:

傳入函數formatresult的輸入參數f可以是一個普通的函數如factorial,abs。也可用函數文本,隻要它的類型是int => int就可以了。以上匿名函數的各種表述形式可以參考一下scala語言教程。