我是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
答案 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。