gpt4 book ai didi

recursion - 为什么在 F# 中使用递归函数而不是 `while true do`?

转载 作者:行者123 更新时间:2023-12-02 11:26:20 24 4
gpt4 key购买 nike

在观看Pluralsight course时作者:Tomas Petricek(我想他知道他在说什么),我看到了如下代码......

let echo =
MailboxProcessor<string>.Start(fun inbox ->
async {
while do true
let! msg = inbox.Receive()
printfn "Hello %s" msg
})

忽略这是为了演示代理的事实,我对内部函数感兴趣,它使用 while do true使其无限期地运行。

在寻找代理的其他示例时,我发现许多其他人使用这样的代码......

let counter =
MailboxProcessor.Start(fun inbox ->
let rec loop n =
async { do printfn "n = %d, waiting..." n
let! msg = inbox.Receive()
return! loop(n+msg) }
loop 0)

代码复制自Wikibooks .

这里的内部函数是递归的,在主函数声明结束之前通过使用基值调用它来启动。

现在我意识到,在第二种情况下,递归是一种将私有(private)值传递给内部函数的便捷方法,而无需使用可变的本地值,但是除了 while do true 之外,还有其他原因在这里使用递归吗? ?使用递归编写第一个代码片段有什么好处吗?

我发现非递归版本更容易阅读(当然是主观意见),这似乎是尽可能使用它的一个很好的理由。

最佳答案

具体谈论MailboxProcessor,我认为选择取决于您到底在做什么。一般来说,您始终可以使用 while 循环或递归。

递归使使用不可变状态变得更容易,并且我发现如果您没有状态或使用可变状态,则 while 循环会更好。使用可变状态通常非常有用,因为 MailboxProcessor 可以保护您免受并发访问的影响,并且您可以将状态保留在本地,因此像 Dictionary (高效哈希表)这样的东西通常很有用。

一般来说:

  • 如果你不需要任何状态,我更喜欢 while
  • 如果您有可变状态(例如 DictionaryResizeArray),我会选择 while
  • 如果你有一些不可变的状态(比如函数列表或整数),那么递归会更好
  • 如果您的逻辑在多种操作模式之间切换,那么您可以将其编写为两个相互递归的函数,这对于循环来说是不太可行的。

关于recursion - 为什么在 F# 中使用递归函数而不是 `while true do`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50101327/

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