递归函数如何在scala中返回结果?

时间:2019-10-21 17:14:38

标签: scala recursion functional-programming factorial

我目前正在学习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这是结果。有人可以帮我理解吗?感谢您能提供的任何帮助

2 个答案:

答案 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)
}
相关问题