2013-05-18 187 views
3

好吧,我得到這個所有的遞歸更實用,因爲你沒有改變迭代中任何對象的狀態。但是沒有什麼能阻止你在scala中做到這一點。斯卡拉遞歸沒有副作用

var magoo = 7; 

    def mergeSort(xs: List[Int]): List[Int] = { 
    ... 
    magoo = magoo + 1 
    mergeSort(xs1, xs2); 

    } 

事實上,你可以遞歸就像在斯卡拉側effectless,你可以在Java中。 因此,說Scala只是簡化使用模式匹配來編寫簡潔的遞歸是否公平呢?就像沒有什麼能阻止我用Java編寫任何無狀態的遞歸代碼,我可以在Scala中編寫代碼?

這點真的是在斯卡拉複雜的遞歸可以用整潔的代碼來實現。 就是這樣。 是否正確?

回答

4

如果當然,你可以在Java中做複雜的遞歸。如果你願意,你可以在彙編中做複雜的遞歸。但是在Scala中它更容易做到。 此外,Scala還有tail調用優化,如果您希望將任意任意迭代算法編寫爲遞歸方法而不會導致堆棧溢出或性能下降,這一點非常重要。

5

會阻止你用Java編寫遞歸代碼:尾部呼叫消除(TCE)。在Java中,可能會在深遞歸中獲得StackOverflowException,而in Scala tail calls will be optimized(內部表示爲循環)。

因此,它是公平地說,斯卡拉只是使其更易於使用模式匹配寫簡潔 遞歸?

我認爲在斯卡拉這兩個概念是相互正交的。

2

很少有編程語言實際上禁止你編寫不可變的代碼。實際上,真正的純函數語言可能只是Haskell,甚至Scheme和ML也有一些方法來使用可變值。所以,功能風格只需鼓勵你編寫不可變的代碼。這取決於你自己選擇是否改變價值。