将列表转换为矩阵

时间:2011-11-03 17:40:17

标签: prolog

我整个下午都在做一件简单的事,但由于某种原因似乎无法正确使用:如何将列表转换为给定宽度的矩阵。

示例: 我有一个列表,如

[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 个答案:

答案 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]

您需要遍历两个数组才能完成此任务。

希望它有所帮助。