我目前正在学习Scala,并且陷入以下困境: 我有这种算法可以递归地找到数字的阶乘:
def fact(n:Int): Int=
{
if(n == 1) 1
else n * fact(n - 1)
}
println(fact(5))
我的问题是,为什么这行:if(n == 1) 1
确实如此?是不是意味着函数应该返回1或n应该变成1?我不明白这个函数如何返回120这是结果。有人可以帮我理解吗?感谢您能提供的任何帮助
答案 0 :(得分:3)
嗯,这是一个非常广泛的问题。
由于您要求对语言的运算符有基本的了解。我会尽力向您解释这一切,但我建议您对编程课程进行正式介绍。
在 Scala 中,所有内容都是表达式。因此,函数本身就是一个表达式,该表达式的值等于分配的 block 。
在这种情况下,块只是一个timer(0, 20000).subscribe(
(...args) => console.log(args),
(...args) => console.error(args)
);
表达式,它使用谓词来决定要选择两个分支中的哪个。在这种情况下,if / else
检查n == 1
是否等于n
,如果是,则返回 1
,如果不是,则< em>返回 1
。
因此,如果我们使用“等式推理” 自行执行该算法,则我们可以了解其工作原理。
n * fact(n -1)
答案 1 :(得分:0)
让这种方法更加面向c。
现在也许更清楚了,有两个分支
1.当n等于1时-停止递归。
2.否则-用n-1调用事实方法的结果乘以n的当前值,该结果最终变为1并停止递归。
def fact(n:Int): Int=
{
if (n == 1) {
(return) 1;
}
else {
(return) n * fact(n - 1);
}
}
分号是多余的,不建议/不必要使用return关键字。
您可以阅读有关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)
}