Превратить список в матрицу - PullRequest
1 голос
/ 03 ноября 2011

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

Пример: У меня есть список, такой как

[1, 3, 5, 7, 6, 8, 9, 0]

и хотите создать такую ​​матрицу, как

[[1, 3],
 [5, 7],
 [6, 8],
 [9, 0]]

через предикат

list2matrix/3 : list2matrix(List, Size_of_Rows, Matrix).

В этом примере используется как:

list2matrix([1, 3, 5, 7, 6, 8, 9, 0], 2, Matrix).

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

Я решил не публиковать свою работу, так как, по-моему, я так неправильно понял, что это не поможет мне исправить ее; (

Заранее спасибо, если вы можете предложить какие-либо предложения о том, как справиться с такой проблемой.

Ответы [ 3 ]

2 голосов
/ 03 ноября 2011

Вы можете разделить проблему на две части.Первым строительным блоком будет построение ряда из N элементов.То есть взять список ввода и разделить его на два списка, один из которых будет содержать ровно N элементов (строку), а другой - оставшуюся часть списка ввода.

Второй строительный блок будет состоять изматрица из рядов.

list_to_matrix([], _, []).
list_to_matrix(List, Size, [Row|Matrix]):-
  list_to_matrix_row(List, Size, Row, Tail),
  list_to_matrix(Tail, Size, Matrix).

list_to_matrix_row(Tail, 0, [], Tail).
list_to_matrix_row([Item|List], Size, [Item|Row], Tail):-
  NSize is Size-1,
  list_to_matrix_row(List, NSize, Row, Tail).
2 голосов
/ 13 декабря 2011

Кстати, я думал, что упомяну код, который я наконец написал:

length_(Length, List) :- length(List, Length).

list2matrix(List, RowSize, Matrix) :-
    length(List, L),
    HowManyRows is L div RowSize,
    length(Matrix, HowManyRows),
    maplist(length_(RowSize), Matrix),
    append(Matrix, List).

Это более ориентированный на высокий порядок и более забавный для чтения, я думаю:)

1 голос
/ 03 ноября 2011

Ищите шаблон в желаемом результате.Это означает, что номера пар будут выделяться как второе число в каждой паре, а непары будут каждый раз на первом месте.Создайте двумерный массив и назначьте непарные позиции субиндексу «a», а пары - «b».

Как вы могли заметить, «i» - это индекс для массива, многомерного массива.i [a] [b]

Вам необходимо выполнить итерацию по обоим массивам для достижения этой цели.

Надеюсь, это поможет.

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