Сортировка массива Императивный ocaml
Я делаю довольно простой пример, чтобы узнать, как использовать 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 ;;
Спасибо.
Изменить 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 ;;
2 ответа
Прежде всего, нет let x = y;
выражение в OCaml, правильный синтаксис 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 ;;
Следующее исправление в коде может помочь - по крайней мере, скомпилировать код -:
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) - так как массив является ключевым словом, но я не думаю, что это необходимо.