gpt4 book ai didi

ruby - 为什么这段代码会导致堆栈溢出?

转载 作者:数据小太阳 更新时间:2023-10-29 06:57:22 26 4
gpt4 key购买 nike

以下内容会导致大 'n' 的堆栈溢出,我能理解为什么。

def factorial(n)
(n > 1) ? (return (n * factorial(n - 1))) : (return 1)
end

为什么以下也会导致溢出?

def factorial(n, k)
(n > 1) ? (return factorial(n - 1, lambda {|v| return k.call(v * n)})) : (return k.call(1))
end

最佳答案

您的第二个算法创建一个 n 长的 lambda 过程链,每个过程都包含对前一个过程的引用。我不知道 Ruby 到底做了什么,但在适当的尾递归语言中,堆栈不会在你的第二个算法中溢出,因为 lambda 中的 k.call 也处于尾部位置。如果像 Brian 的实验所暗示的那样,Ruby 没有适当的尾调用,那么当调用链的头部时,对 lambda 的 n 嵌套调用链将溢出堆栈,即使 Ruby足够聪明,可以将尾递归 factorial 调用转换为循环(= 尾调用优化)。

关于ruby - 为什么这段代码会导致堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/761867/

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