棘手的递归(尾部)函数示例

时间:2017-03-25 12:16:14

标签: ocaml tail-recursion

我从不喜欢玩定义,特别是在采访中。 据我所知:

编辑:

尾递归函数是一种在递归调用后不再进行任何计算的函数。

我认为第二个不是尾递归,因为它根本不进行递归调用,因此不是尾递归。

但是第一个是尾递归,即使它进行了两次递归调用,之后也没有做任何事情,所以我想我在这里正确地使用了尾部递归的定义。

let rec func x =
    if x > 10 then x else func (func (x+1))  

let f a b = a + b

1 个答案:

答案 0 :(得分:1)

您对递归函数的定义是 tail 递归函数的定义。递归函数简单地定义为在其执行中的某个点调用自身的函数。该定义还允许间接递归的函数,即它们再次调用另一个调用原始函数的函数(此链可以是任意长度)。

你认为你的第二个函数根本不是递归的,你是正确的。但是,第一个函数是 not 尾递归。

如果我们将此函数移动到Scala,我们会得到;

@tailrec
def func(x: Int): Int = 
{
    if (x > 10) x
    else func(func(x+1))
}

@tailrec注释告诉我们是否有尾递归。但是,编译器通知我们有一个不在尾部位置的递归调用。即,两个呼叫的内部。尾递归函数要求对函数的所有调用都处于尾部位置,而不仅仅是最终调用处于尾部位置