Function 是';def eat():单位=睡眠();def sleep():单位=eat()';尾部递归函数?

Function 是';def eat():单位=睡眠();def sleep():单位=eat()';尾部递归函数?,function,scala,recursion,tail-recursion,Function,Scala,Recursion,Tail Recursion,两个功能: def eat(): Unit = sleep() def sleep(): Unit = eat() 它们都是递归函数,因为它们在主体中(间接)调用自己,对吗 但它们是尾部递归函数吗 它们都是递归函数,因为它们在主体中(间接)调用自己,对吗 是的,这个叫 但它们是尾部递归函数吗 是的,它们是,因为调用是主体的返回值。但是,Scala编译器不会将这些优化为,而循环,它只对自递归函数进行优化。有关详细信息和解决方法,请参见 它们都是递归函数,因为它们在主体中(间接)调用自己,对吗 是

两个功能:

def eat(): Unit = sleep()
def sleep(): Unit = eat()
它们都是递归函数,因为它们在主体中(间接)调用自己,对吗

但它们是尾部递归函数吗

它们都是递归函数,因为它们在主体中(间接)调用自己,对吗

是的,这个叫

但它们是尾部递归函数吗

是的,它们是,因为调用是主体的返回值。但是,Scala编译器不会将这些优化为
,而
循环,它只对自递归函数进行优化。有关详细信息和解决方法,请参见

它们都是递归函数,因为它们在主体中(间接)调用自己,对吗

是的,这个叫

但它们是尾部递归函数吗


是的,它们是,因为调用是主体的返回值。但是,Scala编译器不会将这些优化为
,而
循环,它只对自递归函数进行优化。有关详细信息和解决方法,请参阅。

确切地说,Scala仅在方法在尾部位置直接调用自身时优化直接尾部递归。这是希望与宿主语言保持互操作性的一个有点不幸的结果,因为JVM的
GOTO
只允许您跳转到同一方法内的目标。请注意,在面向对象语言中,方法是否调用“自身”实际上并不明显,因为它可能会调用不同的重载或重写版本。确切地说,Scala仅在方法在尾部位置直接调用自身时优化直接尾部递归。这是希望与宿主语言保持互操作性的一个有点不幸的结果,因为JVM的
GOTO
只允许您跳转到同一方法内的目标。请注意,在面向对象语言中,方法是否调用“自身”实际上并不明显,因为它可能调用不同的重载或重写版本。