尝试学习F#排序整数列表

2024-09-26 22:49:33 发布

您现在位置:Python中文网/ 问答频道 /正文

在过去的几个月里,我一直在使用Python,现在我正试着给F#一个机会。只是…我不太明白。过去几天我一直在阅读文档,但仍然不完全理解如何完成基本任务。在

我一直在学习tryfsharp.org网站以及fsharp.net网站. 在

例如,我如何完成用Python编写的基本任务,而不是用F?在

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

Tags: in文档orgfornetlenif网站
3条回答

请注意,您的python版本不正确。It输出:

[4, 8, 9, 15, 21, 33, 71, 82, 89]

缺少7。在

以下是直接翻译:

^{pr2}$

翻译后的版本与Python版本几乎完全相同。但这并不是编写F程序的理想方法。对于F#中的排序算法,您可以在我的博客上阅读一篇博文:

http://fdatamining.blogspot.com/2010/03/test.html

当将代码从命令式语言移植到函数式语言时,您应该尝试转换代码中使用的算法,而不是代码本身。在

代码正在执行selection sort,所以您想问问自己,选择排序是做什么的?在

  • 找到最小值
  • 把它放在分类列表的前面。在
  • 对其余的项目进行排序,将结果放在最小值之后。在

那么代码会是什么样子呢?这肯定会奏效:

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 *)

我知道如果你想要一个直接的翻译,这可能不是你想要的,但是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#的做法不同。我去年写的这篇文章可能会有帮助

相关问题 更多 >

    热门问题