递归函数 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)
}
我目前正在学习 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)
}