Пытаюсь выучить F # ... сортировать список целых чисел - PullRequest
2 голосов
/ 24 мая 2011

Я использовал 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

Ответы [ 3 ]

5 голосов
/ 24 мая 2011

При переносе кода с императивного языка на функциональный язык вы должны попытаться преобразовать алгоритм, который используется в коде, а не сам код IMHO.

Код выполняет сортировку выбора , поэтому вы хотите спросить себя, что делает сортировка выбора?

  • найти минимум
  • поместите его в начало отсортированного списка.
  • Сортировка остальных элементов с размещением результатов после минимума.

Так как бы выглядел код? Это наверняка сработает:

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 *)
4 голосов
/ 24 мая 2011

Обратите внимание, что ваша версия 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)

Переведенная версия почти точно такая же, как Pythonодин.Но это не идеальный способ написания программ на F #.Для алгоритмов сортировки в F # вы можете прочитать сообщение в моем блоге:

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

2 голосов
/ 24 мая 2011

Я понимаю, что это может быть не совсем то, что вы ищете, если вам нужен прямой перевод, но 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...