如何解决试图学习F#…排序整数列表
| 在过去的几个月中,我一直在使用Python,现在正尝试使F#旋转。只是...我真的不明白。我过去几天一直在阅读文档,但仍然不完全了解如何完成基本任务。 我一直在关注tryfsharp.org和fsharp.net上的教程。 例如,我将如何用F#完成用Python编写的基本任务?unsorted = [82,9,15,8,21,33,4,89,71,7]
sorted = []
for n in range(1,len(unsorted)):
lowest = 0
for i in range(0,len(unsorted)-1):
if unsorted[i] < unsorted[lowest]:
lowest = i
sorted.append(unsorted[lowest])
del unsorted[lowest]
print sorted
解决方法
将代码从命令性语言移植到功能性语言时,应尝试转换代码中使用的算法,而不是代码本身恕我直言。
代码正在执行选择排序,因此您想问自己,选择排序是做什么的?
找到最小值
将其放在排序列表的最前面。
排序其余项目,将结果放在最小值之后。
那么代码是什么样的呢?这肯定可以工作:
let rec selection_sort = function
| [] -> []
| l -> let min = List.min l in (* find the minimum *)
let rest = List.filter (fun i -> i <> min) l in (* find the rest *)
let sorted_rest = selection_sort rest in (* sort the rest *)
min :: sorted_rest (* put everything together *)
,请注意,您的python版本不正确。它输出:
[4,8,9,15,21,33,71,82,89]
3ѭ。
这是直接的F#翻译:
let unsorted = new ResizeArray<int> ([| 82; 9; 15; 8; 21; 33; 4; 89; 71; 7 |])
let sorted = new ResizeArray<int> ()
for n=1 to unsorted.Count-1 do
let mutable lowest = 0
for i=0 to unsorted.Count-1 do // i changed this line so the output is correct.
if unsorted.[i] < unsorted.[lowest] then
lowest <- i
sorted.Add(unsorted.[lowest])
unsorted.RemoveAt(lowest)
printfn \"%A\" (sorted |> Seq.toArray)
转换后的版本与Python几乎完全相同。但这不是编写F#程序的理想方法。有关F#中的排序算法,您可以阅读我的博客上的博客文章:
http://fdatamining.blogspot.com/2010/03/test.html
,我意识到,如果您想要直接翻译,这可能并不是您想要的,但是F#和函数式编程往往更强调声明式编程,而不是命令式语言。例如,如果要对数字列表进行排序,只需对它们进行排序:
let unsorted = [2; 9; 15; 8; 21; 33; 4; 89; 71; 7]
let sorted = unsorted |> List.sort
//now print em out
sorted |> List.iter (printfn \"%d\")
如果您在使用F#时遇到问题,那么稍微阅读一下函数式编程可能会有所帮助,以帮助您理解F#为何做不同的事情。我去年写的这篇文章可能对http://msdn.microsoft.com/en-us/magazine/ee336127.aspx有帮助
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。