所以我有一个通用的组合器。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