2014-11-22 1 views
3

Я делаю довольно простой пример, чтобы узнать, как использовать ocaml как императивный язык. Моя догадка я перепутались с запятой, но я не могу найти какие-либо ошибки в кодеСортировка массива Imperative ocaml

let sort array = 
for index = 0 to (Array.length array -1) do 
    let boole = ref false; 
    let pos = ref index; 
    let max = ref array.(index); 
    let p = ref !pos; 
    let m = ref !max; 
    while !pos <> (Array.lenght array -1) do 
     if array.(!pos) > !max then begin 
      max := array(!pos); 
      boole := true; 
      p := !pos 
     end 
     pos := !pos + 1 
    done; 
    if (!boole = true) then begin 
     array.(index) <- max; 
     array.(pos) <- m 
    end 
done ;; 

Спасибо.

Edit 1:

В случае, если кто попадается этот вопрос, я отправляю правильный код вызвать выше, не сортирует массив правильно, даже с правильным синтаксисом:

let sort array = 
for index = 0 to (Array.length array -1) do 
let boole = ref false in 
let pos = ref index in 
let max = ref array.(index) in 
let p = ref !pos in 
let m = ref !max in  
for i = !pos to (Array.length array -1) do 
    if (array.(i) > !max) then begin 
    pos :=i;  
    max := array.(!pos); 
    boole := true; 
    end; 
done; 
if (!boole = true) then begin 
    array.(!pos) <- !m; 
    array.(!p) <- !max; 
end; 
done ;; 
+0

вопрос: почему бы не использовать bubblesort algo? На первый взгляд, я не понимаю алго, которое вы используете. –

+0

@JoeGob Я просто возился с императивным программированием в ocaml, я не искал лучшего алгоритма –

ответ

3

Прежде всего, в OCaml нет выражения let x = y;, правильный синтаксис - let x = y in, также не следует забывать разыменовывать ваши ссылки.

let sort array = 
    for index = 0 to (Array.length array -1) do 
    let boole = ref false in 
    let pos = ref index in 
    let max = ref array.(index) in 
    let p = ref !pos in 
    let m = ref !max in 
    while !pos <> (Array.length array -1) do 
     if array.(!pos) > !max then begin 
     max := array.(!pos); 
     boole := true; 
     p := !pos 
     end; 
     pos := !pos + 1; 
    done; 
    if (!boole = true) then begin 
     array.(index) <- !max; 
     array.(!pos) <- !m; 
    end; 
    done ;; 
+0

Хорошо, я не знал, что мне нужно использовать синтаксис let in. Спасибо! –

+0

Существует 'let x = y;' на верхнем уровне, но не в выражении. – newacct

+0

уверен, что это не выражение, это утверждение, которое можно использовать как верхний уровень. – ivg

0

следующие исправления в коде может помочь - по крайней мере, чтобы получить код скомпилирован -:

let sort toto = 
     for index = 0 to (Array.length toto - 1) do 
       let boole = ref false in 
       let pos = ref index in 
       let max = ref toto.(index) in 
       let p = ref !pos in 
       let m = ref !max in 
       begin 
         while !pos <> (Array.length toto - 1) do 
         begin 
           if (toto.(!pos) > !max) then 
           begin 
             max := toto.(!pos); 
             boole := true; 
             p := !pos; 
           end; 
           pos := !pos + 1; 
         end 
         done; 
         if (!boole = true) then begin 
           toto.(index) <- !max; 
           toto.(!pos) <- !m 
         end 
       end 
     done;; 

Следует отметить: объявление локальной переменной, а также некоторые недостающие точки с запятой. Я изменяю имя аргумента (массив toto) - поскольку массив является ключевым словом, но я не думаю, что это необходимо.

+0

хорошо - то же предложение, как и у другого ответа, - но downvoted ... Я бы хотел понять. –

+0

, пожалуйста, подумайте о том, чтобы использовать правильную идентификацию OCaml, лучше всего использовать 'ocp-indent'. Кроме того, нет необходимости добавлять эти блоки 'begin/end' в конструкции' while', так как они уже содержат неявные блоки. Третий, имена, такие как 'array',' list' и т. Д., Могут использоваться в OCaml, а использование 'toto' является уродливым. – ivg

+0

thx для подсказок! Тото уродливо: 100% согласны! –

 Смежные вопросы

  • Нет связанных вопросов^_^