【发布时间】:2021-02-07 22:22:48
【问题描述】:
我有两种方法,nTimes 和 nTimesBetter。这两个函数都对作为参数传递的函数执行 n 次操作。
方法nTimes 接受一个函数f,它必须被调用的次数n 以及函数在x 上工作的初始值
def nTimes(f:Int=>Int,n:Int,x:Int):Int =
if (n <= 0) x
else
nTimes(f, n-1, f(x))
以下是使用某个函数f、n = 3 和x = 1 调用该方法时发生的情况:
// nTimes(f,3,1)
// nTimes(f,2,f(1))
// nTimes(f,1,f(f(1)))
// nTimes(f,0,f(f(f(1))))
方法nTimesBetter方法不取初始值,只取一个函数f和该函数应该被调用的次数n
def nTimesBetter(f:Int=>Int,n:Int):(Int=>Int)=
if (n <= 0) x => x
else
x => nTimesBetter(f, n-1)(f(x))
nTimesBetter 返回一个可以应用于初始值的函数
println(nTimes((x:Int)=>x+1,10,1))
val plus10 = nTimesBetter((x:Int)=>x+1,10)
println(plus10(1))
有人可以用一堆执行和使用(x:Int) => nTimesBetter(f,n-1)(f(x)) 来解释nTimesBetter 吗?为什么(f(x))被这样调用。
【问题讨论】:
-
旁注:当您已经拥有
nTimes时,编写nTimesBetter的简单方法是def nTimesBetter(f: Int => Int, n: Int) = nTimes(f, n, _)
标签: scala functional-programming