Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 尝试学习F#…整数排序列表_Python_Sorting_F# - Fatal编程技术网

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

Python 尝试学习F#…整数排序列表,python,sorting,f#,Python,Sorting,F#,在过去的几个月里,我一直在使用Python,现在我正试着给F#一个尝试。只是…我真的不明白。在过去的几天里,我一直在阅读文档,但仍然不完全理解如何完成基本任务 我一直在关注tryfsharp.org和fsharp.net上的教程 例如,我如何完成用Python编写的基本任务,而不是用F# unsorted=[82,9,15,8,21,33,4,89,71,7] 排序=[] 对于范围(1,len(未排序))中的n: 最低=0 对于范围(0,len(未排序)-1中的i: 如果未排序[i]let mi

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

我一直在关注tryfsharp.org和fsharp.net上的教程

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

unsorted=[82,9,15,8,21,33,4,89,71,7]
排序=[]
对于范围(1,len(未排序))中的n:
最低=0
对于范围(0,len(未排序)-1中的i:
如果未排序[i]<未排序[最低]:
最低=i
已排序。追加(未排序[最低])
del unsorted[最低]
打印排序

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

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

这是一个直接的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)
let unsorted=new ResizeArray([82;9;15;8;21;33;4;89;71;7 |])
let sorted=新的大小调整数组()
对于n=1到未排序。计数-1 do
设可变最小值=0
对于i=0到unsorted.Count-1 do//,我更改了此行以便输出正确。
如果未排序,[i]
翻译后的版本与Python版本几乎完全相同。但这不是编写F#程序的理想方式。对于F#中的排序算法,您可以在我的博客上阅读一篇博文:


我意识到,如果您想要直接翻译,这可能不是您想要的,但是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#会有不同的做法。在将代码从命令式语言移植到函数式语言时,应该尝试转换代码中使用的算法,而不是代码本身

代码正在执行一个任务,因此您想问自己,选择排序是做什么的

  • 求最小值
  • 把它放在排序列表的前面
  • 对其余项目进行排序,将结果放在最小值之后
那么代码是什么样子的呢?这肯定会奏效:

let rec selection\u sort=函数
| [] -> []
|l->let min=List.min l in(*找到最小值*)
让rest=List.filter(fun i->i min)l in(*找到其余部分*)
让排序的\u rest=选择项\u排序rest in(*对其余部分排序*)
min::已排序的_rest(*将所有内容放在一起*)

非常地道。但我真正喜欢F#/Ocaml的是,它可以让你用两种方式来做,就像这样,或者像尹朱给出的版本。“我在过去几个月一直在使用Python,现在正在尝试给F#一次尝试……但仍然不完全理解如何完成基本任务。”别担心,在使用F#的最初几周里,你会有这种感觉,然后它点击,你无法想象不使用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")