LINUX.ORG.RU

[школота-тред] синтаксис в Ocaml


0

1

Пытаюсь написать quicksort, но не могу понять куда мне в итоге добавлять «голову» в отсортированный лист. Имеем:

let rec append lst1 lst2 =
  match lst1 with
  [] -> lst2
  | h::t -> h :: append t lst2 ;;  

let letf x y =
  x < y;; 

let right x y =
  x >= y;;

let rec filter f lst = 
   match lst with
   [] -> []
  | h::t -> if (f h) then h :: (filter f t) else filter f t;;

сам quickSort:

let rec quickSort lst =
  match lst with
  [] -> []
  | h::t -> append(quickSort(filter(left h) t)) (quickSort(filter(right h) t)) ;; (* <- как здесь добавить 'h' в отсортированный лист? *)


Последнее исправление: Sonsee (всего исправлений: 2)

Ответ на: комментарий от Rastafarra

кстати, может быть right надо сделать как >=

да это понятно..

append (append(quickSort(filter(left h) t)), h), (quickSort(filter(right h) t)))

тогда получается:

val quickSort : 'a list list -> 'a list = <fun>
Sonsee
() автор топика
Ответ на: комментарий от Rastafarra

ааа...

Ты имел в виду, чтоб голова в filter попала? :)

Так проблема не в этом. Функция же рекурсивная, поэтому голова - единственное что вообще добавляется в лист. В таком виде как сейчас он мне просто вернет пустой лист, а не «без головы» ;)

Sonsee
() автор топика
Ответ на: комментарий от Sonsee

В таком виде как сейчас он мне просто вернет пустой лист, а не «без головы» ;)

а...

let rec quickSort lst =
  match lst with
  [] -> []
  | h :: [] -> [h] (* <--- sic! *)
  | h::t -> append(quickSort(filter(left h) t)) (quickSort(filter(right h) t)) ;; (* <- как здесь добавить 'h' в отсортированный лист? *)

это что ли?

зы. проверил бы, да нет окамля под рукой...

Rastafarra ★★★★
()
Ответ на: комментарий от Rastafarra
append (quickSort (filter (left h) t)) (h :: quickSort (filter (right h) t))

Только в окамле так писать смысла нет. Там есть мутабельные массивы. Поэтому запрограммировать quickSort можно так же эффективно, как в каком-нибудь Си.

dave ★★★★★
()
Ответ на: комментарий от dave

ну я-то тут при чем?

у человека есть код, есть бага и есть просьба поправить. я поправил, исходя из заданных параметров. что не так? :)

если мне мой склероз не изменяет, там и :: нет, а есть @ (и append можно убрать), но тебя это тоже вроде не останавливает, уточняющие-точный ты мой.

Rastafarra ★★★★
()
Ответ на: комментарий от dave

Только в окамле так писать смысла нет.

Тебе нет смысла - не пиши.

Sonsee
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.