我在Scala中学习嵌套函数,这里有一些我遇到问题的代码
object Main extends App {
val fac = (x: Int) => {
val factorial: (Int, Int) => Int = (x, accum) => if (x == 1) accum else factorial(x-1, accum*x)
factorial(x,1)
}
println(fac(3))
}
编译器给出了这个错误:
前向引用扩展了对价值因子的定义
val factorial:(Int,Int)=> Int =(x,accum)=> if(x == 1)accum else factorial(x-1,accum * x)**
我做错了什么?
答案 0 :(得分:1)
您应该使用factorial
而不是def
声明val
:
val
表示它是值,在声明时评估一次;因此,很容易理解为什么编译器在评估时无法使用该定义def
表示它是方法,每次调用都会单独评估,因此支持在定义中引用自身(递归)写这个的方法可能不那么令人困惑,那就是将此方法声明为需要参数的方法,而不是返回需要这些参数的函数的方法:
val fac = (x: Int) => {
def factorial(x: Int, accum: Int): Int = if (x == 1) accum else factorial(x-1, accum*x)
factorial(x,1)
}