gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:57:38 28 4
gpt4 key购买 nike

查看此 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com