在我繼續努力學習scala的過程中,我正在通過Odersky的「Scala by Example」以及關於第一類函數的章節,匿名函數部分避免了遞歸匿名函數的情況。我有一個似乎可行的解決方案。我很好奇,如果有更好的答案。如何編寫遞歸匿名函數?
從PDF: 代碼展示高階函數
def sum(f: Int => Int, a: Int, b: Int): Int =
if (a > b) 0 else f(a) + sum(f, a + 1, b)
def id(x: Int): Int = x
def square(x: Int): Int = x * x
def powerOfTwo(x: Int): Int = if (x == 0) 1 else 2 * powerOfTwo(x-1)
def sumInts(a: Int, b: Int): Int = sum(id, a, b)
def sumSquares(a: Int, b: Int): Int = sum(square, a, b)
def sumPowersOfTwo(a: Int, b: Int): Int = sum(powerOfTwo, a, b)
scala> sumPowersOfTwo(2,3)
res0: Int = 12
從PDF: 代碼展示匿名函數
def sum(f: Int => Int, a: Int, b: Int): Int =
if (a > b) 0 else f(a) + sum(f, a + 1, b)
def sumInts(a: Int, b: Int): Int = sum((x: Int) => x, a, b)
def sumSquares(a: Int, b: Int): Int = sum((x: Int) => x * x, a, b)
// no sumPowersOfTwo
我的代碼:
def sumPowersOfTwo(a: Int, b: Int): Int = sum((x: Int) => {
def f(y:Int):Int = if (y==0) 1 else 2 * f(y-1); f(x) }, a, b)
scala> sumPowersOfTwo(2,3)
res0: Int = 12
你確定嗎? 'echo「2^2 + 3^2」| bc -l' - >'13'。 – sarnold
這是一個重複http://stackoverflow.com/questions/5337464/anonymous-recursive-function-in-scala – Suroot
@sarnold兩個權力之和 - 即'2^a + 2^a + 1 + ... 2^b-1 + 2^b'' 2^2 + 2^3 = 4 + 8 = 12' –