所以我有一個通用的組合器。Scala泛型與遞歸
回想一下,兩個函數-F的組成和g--是h(x)= F(G(X))
def inc(x: Double) = x + 1
def double(x: Double) = 2 * x
def compose[A,B,C](f: B => C, g: A => B, x: A): C = f(g(x))
//TEST
println(compose(double, inc, 2.0))
//OUTPUT
// 6.0
但現在我想要實現的自組合物迭代組合子, 遞歸,用我的構建功能,其中:
def selfIter[T](f: T=>T, n: Int) = f composed with itself n times.
我試着這樣做:
def selfIter[T](f: T, n: Int): T = {
if(n == 0) f
else f + selfIter(f, n-1)
}
//TEST
println(selfIter(compose(double, inc, 2.0), 2))
我得到一個錯誤,我知道我正在做一些根本性錯誤,但我無法弄清楚我需要做什麼。
在這種情況下,輸出應該是14.0因爲第一呼叫將是2(2 + 1)= 6.0,然後第二呼叫將是2(6.0 + 1)= 14.0
問題:我應該如何修改我的代碼,以便selfIter將組成f控制自己n次,直到我們有N == 0,並返回最終值
如果我不允許在撰寫功能中更改任何內容,該怎麼辦?我會如何做到這一點?遞歸是必須的 – Phillip
可以解釋一些關於撰寫第三個參數。爲什麼你使用了_以及如何使用這個函數.chain和list.fill – Phillip
如果你看'selfIter'方法,第一個參數是類型T => T,我們可以通過傳遞'(v:Double)= > compose(double,inc,v)',這相當於'compose(double,inc,_)' – Mikel