我找不到"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“,代码就很糟糕。
遗憾的是,"break/continue“也不可用。
发布于 2010-06-10 17:37:56
F#非常适合于非函数式编程。事实上,对我来说,能够以命令式风格微调算法的各个部分是这门语言的主要优点之一。
例如,在处理项目euler问题时,我首先使用了一个使用不可变集合和折叠的干净的函数解决方案。它花了150秒才完成。现在,有了我的算法框架,我可以一次拆分数据结构和折叠一个操作,直到我设法将运行时间减少到5秒。我的最终解决方案是一个非常强制性的解决方案(甚至比同等的C#版本还要快一点)。
如你所见,我首先用函数式风格编写了一个解决方案,然后将小部分重写为命令式风格,从而解决了这个问题。不需要处理索引和其他循环条件,这使得代码对我来说更容易理解。
一旦你学会了如何像函数式程序员那样思考,你会发现你很少想要休息和继续。这就是我所经历的。但如果您确实需要它们,了解如何以函数式方式思考有助于提出变通方法,通常涉及过去循环的尾递归版本。
当您开始以一种惯用的F#方式思考时,您可能会看到越来越多的(尾部)递归代码取代了您过去使用循环构造所做的工作。见鬼,写了两年的F#到目前为止已经扭曲了我的思想,我更有可能选择递归和折叠而不是循环。
每当我认为我需要中断/继续时,我通常不会这样做,因为有一个更干净版本的算法隐藏起来,等待着退出。最大的挑战是学习如何找到更干净的版本。我担心大量的练习和好的例子是更好地从功能上思考的唯一途径,但我相信这是值得的。
编辑:具有讽刺意味的是,冒泡排序算法实际上是为具有可变内容的数组设计的。任何递归冒泡排序都可能比命令式排序更难理解。我想我刚刚毁了我在这里的帖子。
发布于 2015-04-27 02:49:34
let doWhile f c =
f ()
while c () do
f ()
发布于 2010-06-10 15:50:56
break
和continue
将是一个非常有用的新特性;它们是保留字,也许我们会在该语言的未来版本中看到它们。缺少它们偶尔是一种小烦恼,但几乎不会使语言“不合适”。同时,一个可变的前哨可以工作,就像你在示例中所做的那样。
另请参阅
https://stackoverflow.com/questions/3012533
复制相似问题