Scala课程“Currying”

时间:2014-01-20 13:48:17

标签: scala currying

我是Scala的新手,我遇到了currying的问题,无法理解下面代码的答案是144.希望你们能在这里帮助我。

由于

def product (f: Int => Int)(a: Int, b: Int) : Int =
   if(a>b) 1
   else f(a) * product(f)(a + 1, b)

product(x => x * x)(3, 4) //answer = 144

2 个答案:

答案 0 :(得分:5)

这与currying无关。您可以像这样重写product方法:

def product(f: Int => Int, a: Int, b: Int) : Int =
   if(a>b) 1
   else f(a) * product(f, a + 1, b)

val f = (x: Int) => x*x

product(f, 3, 4) // still 144

您可以将product(f, a, b)替换为f(a) * product(f, a+1, b)(如果< = b)或1,您也可以将f(a)替换为a*a

product(f, 3, 4) ==
9 * product(f, 4, 4) ==
9 * ( 16 * product(f, 5, 4) ) ==
9 * ( 16 * 1 ) ==
144

答案 1 :(得分:0)

此方法的第一个参数是将整数映射到整数的函数,即。在给定的示例中,它将传递给它的数字平方。

函数'product'然后使用该函数(作为第一个参数传递),并将其应用于第一个参数('a')并将该结果乘以递归调用'product'并使用相同的'f',但使用第一个参数递增。 正如您所注意到的,名为“b”的参数除了限制函数“product”的执行次数外,不会起任何计算作用。

因此,为了解决'产品'的调用,我们从'a = 3,b = 4'开始。 首先,当'a'小于或等于'b'时,我们转到其他分支,我们将第一个参数'a'(应用'f')放在第一个参数'a'(给出9),然后将其乘以'product(f) )(4,4)'。 我们也在这里转到其他分支,我们将4(作为'a'的执行中的'a'的值)得到16并将其乘以'product(f)(5,4)'。 这里,'a'大于'b',因此我们以值1结束'product'。

当我们传播回来时,我们得到1 * 16 * 9,而这又等于144。