Ожидаемое поведение будет для следующей программы:
def factorial(n: Int): Int =
if (n <= 1) 1
else {
println("Computing factorial of " + n + " - I first need factorial of " + (n-1))
val result = n * factorial(n - 1) // here is the difference def -> val
println("Computed factorial of " + n)
result
}
println(factorial(3))
Между отпечатками вы определяете функцию:
def result = n * factorial(n - 1)
, но это не значит, что вы вызываете Это. Функция (def
) оценивается лениво, а значение (val
) - охотно. Это только определение. После этого вы переходите ко второму println
и result
, где возвращается значение, вызывается функция result
, которая выдает операторы печати для n - 1
.