我整个下午都在做一件简单的事,但由于某种原因似乎无法正确使用:如何将列表转换为给定宽度的矩阵。
示例: 我有一个列表,如
[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).
如果列表的长度不是行大小的倍数,则谓词应该失败。
我决定不发表我的作品,因为我认为我错了以至于无法帮助我纠正它;(
如果您能提出有关如何处理此类问题的任何线索,请提前致谢。
答案 0 :(得分:2)
您可以将问题分为两部分。 第一个构建块是构建一行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).
答案 1 :(得分:2)
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).
我认为它的订单更高,读起来更有趣。)
答案 2 :(得分:1)
寻找所需结果的模式。 这意味着对号将被分配为每对中的第二个数字,而非对每次都将位于第一位。 创建一个二维数组并将非对位置分配给子索引“a” 并配对“b”。
正如您所见,“i”是数组的索引,是一个多维数组。 I [A] [B]
您需要遍历两个数组才能完成此任务。
希望它有所帮助。