gpt4 book ai didi

f# - 为什么 "do...while"在 F# 中不存在

转载 作者:行者123 更新时间:2023-12-03 11:31:51 24 4
gpt4 key购买 nike

我找不到“do...while...”

我必须这样编码:

let bubbleSort a=
let n = Array.length a
let mutable swapped = true
let mutable i = 0
while swapped do
swapped <- false
for j = 0 to n-i-2 do
if a.[j] > a.[j+1] then
let t = a.[j]
a.[j] <- a.[j+1]
a.[j+1] <- t
swapped <- true
i <- i+1

没有“ do...while ”的代码很糟糕。
遗憾的是,“ 中断/继续”也不可用。

最佳答案

F# 非常适合非函数式编程。事实上,能够以命令式风格微调算法的一部分对我来说是该语言的主要优点之一。

例如,在解决项目欧拉问题时,我从使用不可变集合和折叠的干净函数式解决方案开始。完成耗时 150 秒。现在有了我的算法框架,我可以一次分离数据结构和折叠操作,直到我设法将运行时间缩短到 5 秒。我的最终解决方案是非常必要的(甚至比等效的 C# 版本略快)。

如您所见,我通过先以函数式风格编写解决方案,然后将小部分重写为命令式风格来解决它。不必处理索引和其他循环条件,让我更容易理解代码。

一旦你学会了如何像函数式程序员一样思考,你会发现你很少想要休息和继续。这就是我所经历的。但是,如果您确实需要它们,知道如何以函数式方式思考有助于提出变通方法,通常涉及过去循环的尾递归版本。

当您开始以惯用的 F# 方式进行更多思考时,您可能会看到越来越多的(尾)递归代码取代了您过去使用循环结构所做的工作。哎呀,写了 2 年的 F# 现在已经扭曲了我的想法,以至于我更有可能选择递归和循环折叠。

每当我认为我需要中断/继续时,我通常不会这样做,因为有一个更清晰的算法版本隐藏并等待退出。最大的挑战是学习如何找到更干净的版本。我担心大量的练习和好的例子是提高功能性思维的唯一途径,但我相信这是一项值得的努力。

编辑:具有讽刺意味的是,冒泡排序实际上是为具有可变内容的数组设计的算法。任何递归冒泡排序都可能比命令式版本更难理解。我想我只是在这里杀死了自己的帖子。

关于f# - 为什么 "do...while"在 F# 中不存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3012533/

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