scala - 为什么这个尾部递归?

标签 scala tail-recursion

查看此 Scala 代码:

def rec(n: Int) {
  if (n > 1) {
    val d = n / 2
    rec(d)
//    if (d > 1)  // abort loop
      rec(n/d)
  }
}

此代码将导致无限循环。由于尾递归优化,我没有得到 StackOverflowError。

用 jad 反编译我得到这个 Java 代码:

public void rec(int n)
{
    int d;
    for(; n > 1; n /= d)
    {
        int i = n;
        d = i / 2;
        rec(d);
    }
}

在循环的最后一行,该方法调用自身,因此我不理解尾部调用位置。谁能解释一下吗?

最佳答案

rec(d)的情况下没有尾部调用。对于 rec(N) (其中 N > 1),在 log2(N) 调用之后堆栈不再增长(因为之后 >n 永远等于 2 或 3,d 为 1)。之后,它只是带有内部 rec(1) 调用的无限循环,每次都会立即返回。这就是为什么没有堆栈溢出的原因。

关于scala - 为什么这个尾部递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5337177/

相关文章:

scala - 使用SORM通过普通SQL查询获取对象

scala - 将列表 [Int] 映射到字符

java - (Akka HTTP)当我将 .XLSX 文件作为数组 [字节] 发送给用户时,用户将获得该文件夹

algorithm - 尾递归中的局部变量?

haskell - 这些函数是尾递归的吗?

c - Id 返回 1 退出状态错误

scala - 我如何告诉 sbt 使用 Scala 2.12 或 2.13 的夜间版本?

scala - Predef.identity在Scala中做什么?

algorithm - 有人可以通过代码描述一个用迭代而不是递归回溯的实际例子吗?

c++ - 这是否符合尾递归的条件?