我从不喜欢玩定义,特别是在采访中。 据我所知:
编辑:
尾递归函数是一种在递归调用后不再进行任何计算的函数。
我认为第二个不是尾递归,因为它根本不进行递归调用,因此不是尾递归。
但是第一个是尾递归,即使它进行了两次递归调用,之后也没有做任何事情,所以我想我在这里正确地使用了尾部递归的定义。
let rec func x =
if x > 10 then x else func (func (x+1))
let f a b = a + b
答案 0 :(得分:1)
您对递归函数的定义是 tail 递归函数的定义。递归函数简单地定义为在其执行中的某个点调用自身的函数。该定义还允许间接递归的函数,即它们再次调用另一个调用原始函数的函数(此链可以是任意长度)。
你认为你的第二个函数根本不是递归的,你是正确的。但是,第一个函数是 not 尾递归。
如果我们将此函数移动到Scala,我们会得到;
@tailrec
def func(x: Int): Int =
{
if (x > 10) x
else func(func(x+1))
}
@tailrec
注释告诉我们是否有尾递归。但是,编译器通知我们有一个不在尾部位置的递归调用。即,两个呼叫的内部。尾递归函数要求对函数的所有调用都处于尾部位置,而不仅仅是最终调用处于尾部位置