递归函数 return 如何在 scala 中得到结果?

How does a recursive function return the result in scala?

我目前正在学习 Scala,但遇到以下问题: 我有这个算法,它以递归方式找到数字的阶乘:

 def fact(n:Int): Int=
    { 
        if(n == 1) 1
        else n * fact(n - 1) 
    } 
    println(fact(5))

我的问题是,为什么这一行:if(n == 1) 1 确实如此?意思是函数应该 return 1 还是 n 应该变成 1?我不明白这个函数如何 returns 120 这是结果。有人可以帮我理解吗?感谢您提供的任何帮助

嗯,这是一个非常宽泛的问题。
由于您要求对语言的运算符有基本的了解。我会尽力向您解释这一切,但我建议您参加正式的编程入门课程。

Scala 中,一切都是表达式。因此,函数本身是一个表达式,其计算结果为分配的
在这种情况下,块只是一个 if / else 表达式,它采用 predicate 来决定选择两个分支中的哪一个。在这种情况下 n == 1 检查 n 是否等于 1,如果为真,则 returns 1, 如果不是,则 returns n * fact(n -1).

因此,如果我们使用"equational reasoning"自己执行算法,我们就能理解它是如何工作的。

fact(3) = if (3 == 1) 1 else 3 * fact(3 - 1) // replace n in the block.
fact(3) = 3 * fact(2) // reduce the if and the subtraction.
fact(3) = 3 * (if (2 == 1) 1 else 2 * fact(2 - 1)) // expand the fact definition.
fact(3) = 3 * (2 * fact(1)) // reduce the if and the subtraction.
fact(3) = 3 * (2 * (if (1 == 1) 1 else 1 * fact(1 - 1))) // expand the fact definition.
fact(3) = 3 * (2 * (1)) // reduce the if.
fact(3) = 6 // reduce the multiplications.

让这个方法更面向 c。
也许现在更清楚有两个分支
1. 当 n 等于 1 - 停止递归。 2.否则——用n的当前值乘以调用fact方法的结果n-1,最终变成1,停止递归。

def fact(n:Int): Int=
{ 
    if (n == 1) {
       (return) 1;
    }
    else {
       (return) n * fact(n - 1);
    }
}

分号多余,return关键字不是recommended/necessary.
你可以阅读它 here

所以你还剩下:

def fact(n:Int): Int=
{ 
    if (n == 1) {
       1
    }
    else {
        n * fact(n - 1)
    }
}

基本相同:

def fact(n:Int): Int=
{ 
    if (n == 1) 1;
    else n * fact(n - 1)
}