【问题标题】:Is 'def eat():Unit = sleep(); def sleep(): Unit = eat()' a tail recursive function?是 'defeat():Unit = sleep(); def sleep(): Unit = eat()' 尾递归函数?
【发布时间】:2015-10-12 16:45:07
【问题描述】:

两个功能:

def eat(): Unit = sleep()
def sleep(): Unit = eat()

它们都是递归函数,因为它们在体内(间接地)调用了自己,对吧?

但它们是尾递归函数吗?

【问题讨论】:

    标签: function scala recursion tail-recursion


    【解决方案1】:

    它们都是递归函数,因为它们在体内(间接地)调用了自己,对吧?

    是的,这叫mutual recursion

    但它们是尾递归函数吗?

    是的,它们是,因为调用是主体的返回值。然而,afaik Scala 编译器并没有将这些优化成while 循环,它只对自递归函数这样做。有关详细信息,请参阅 Does Scala support tail recursion optimization?,有关解决方法,请参阅 How to use TailCalls?

    【讨论】:

    • 准确地说:Scala 只优化 直接尾递归,当方法直接调用中的自身 >尾部位置。这是希望与宿主语言保持互操作性的一个有点不幸的结果,因为 JVM 的 GOTO 只允许您跳转到同一方法内的目标。请注意,在面向对象的语言中,方法是否调用“自身”实际上并不是很明显,因为它可能会调用不同的重载或覆盖的版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 2011-05-17
    相关资源
    最近更新 更多