gpt4 book ai didi

F# 使用累加器,仍然出现堆栈溢出异常

转载 作者:行者123 更新时间:2023-12-01 13:04:08 25 4
gpt4 key购买 nike

在下面的函数中,我试图通过使用累加器来设置尾递归。但是,我收到堆栈溢出异常,这让我相信我设置函数的方式没有正确启用尾递归。

//F# attempting to make a tail recursive call via accumulator
let rec calc acc startNum =
match startNum with
| d when d = 1 -> List.rev (d::acc)
| e when e%2 = 0 -> calc (e::acc) (e/2)
| _ -> calc (startNum::acc) (startNum * 3 + 1)

据我了解,使用 acc 将允许编译器看到没有必要为每个递归调用保留所有堆栈帧,因为它可以填充每次传递的结果在 acc 中并从每一帧返回。显然我不明白如何正确使用累加器值,所以编译器会进行尾调用。

最佳答案

Stephen Swensen 对问题的评论是正确的,如果您调试,VS 必须禁用尾调用(否则它不会有堆栈帧跟随调用堆栈)。我知道 VS 做到了这一点,但完全忘记了。

在了解了这个之后,我想知道运行时或编译器是否有可能抛出更好的异常,因为编译器知道你正在调试并且你写了一个递归函数,在我看来这可能是可能的让它给你一个提示,比如

'Stack Overflow Exception: a recursive function does not 
tail call by default when in debug mode'

关于F# 使用累加器,仍然出现堆栈溢出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4111390/

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