Запущена проблема с матрицами в ocaml - PullRequest
0 голосов
/ 11 апреля 2020

Итак, я только недавно начал программировать в ocaml для своего университета (это необходимо здесь). Я должен написать функциональную единицу -> (int * int) Array Array Array Array, который создает матрицу 16 на 16, в которой записи являются массивами, которые принимают по 4 кортежа.

Мне было явно сказано не писать это функция рекурсивно, поэтому я сделал это:

let matrice_deplacements () = 
  let u = Array.make 16 (Array.make 16 [||]) in
  for k=0 to 15 do
    for p=0 to 15 do
      u.(k).(p)<-deplacement_grille (k,p)
    done;
  done;
u;;

И я точно знаю, что функция deplacement_grille (извините за французский) работает отлично, и дает мне именно то, что я хочу (что правильно (int * int ) Массив, для хороших k и p)

Я абсолютно не понимаю, в чем проблема, потому что каждый раз, когда я запускаю этот код (я пробовал с 2 * 2 и 3 * 3 матрицами, и это не работает), ocaml возвращает матрицу, где все строки одинаковы (на самом деле они должны быть последней строкой).

Любая помощь приветствуется. Я на самом деле задаюсь вопросом, сводится ли это к тому, как ocaml хранит Array, это может выглядеть как python, где они имеют одинаковый адрес.

1 Ответ

3 голосов
/ 11 апреля 2020

Я предлагаю обратиться к документации Array.make, которая объясняет, что массивы, построенные таким образом, имеют элементы, которые физически равны. Таким образом, ваша начальная строка строит 2 разных массива, а не 17, которые вы ожидаете. (Это должно быть так, поскольку внутреннее приложение-конструктор (Array.make 16 [||]) оценивается в один массив перед передачей его в конструктор внешнего массива.)

Вы, вероятно, хотите вместо этого Array.init, который создает элемент fre sh для каждого индекса. Существует также Array.make_matrix, что похоже на Array.make в том, что матричные элементы изначально физически равны.

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