gpt4 book ai didi

.net - 为什么无限递归不会在F#中遇到堆栈溢出异常?

转载 作者:行者123 更新时间:2023-12-03 10:05:04 25 4
gpt4 key购买 nike

我知道这与人们问堆栈溢出问题时遇到的问题有些相反,但是如果我创建一个函数并按如下方式调用它,我将永远不会收到任何错误,并且应用程序只是磨碎了我的核心CPU,直到我强制退出它:

let rec recursionTest x =
recursionTest x

recursionTest 1

当然,我可以更改此设置,因此它实际上可以执行以下操作:
let rec recursionTest (x: uint64) =
recursionTest (x + 1UL)

recursionTest 0UL

这样,我有时可以在代码中放置一个断点,并看到x的值增长很快,但是仍然没有提示。 F#不在乎无限递归吗?

最佳答案

您的recursionTest函数是尾递归的,这意味着所有递归调用都发生在“尾部位置”,即函数中的最后一个 Action 。这意味着F#编译器不需要为递归调用分配新的堆栈帧,因此不会发生堆栈溢出。

尾部递归是tail call的一种特定情况,尾部调用是针对自身而不是某些其他函数。

关于.net - 为什么无限递归不会在F#中遇到堆栈溢出异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13654437/

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