我有一个矩阵M x N
,我需要切换索引为[1,N]
和[M,N]
的元素的位置。
更新
我是Prolog的新手,这是我的解决方案,返回false :(
main([FirstRow|Tail],X):-
last(FirstRow, A),
last(Tail, LastRow),
last(LastRow, B),
skipLastItem(FirstRow,FirstRowWithoutA),
skipLastItem(LastRow,LastRowWithoutB),
append(FirstRowWithoutA,[B],FirstRowNew),
append(LastRowWithoutB,[A],LastRowNew),
assign([FirstRowNew],X),
skipLastItem(Tail,Middle),
appendAllElements(Middle,X),
append(X,LastRowNew,X).
appendAllElements([X|Tail],List):-
append(List,X,NewList),
appendAllElements(Tail,NewList).
appendAllElements([],_).
assign(Item,Item).
skipLastItem([_],[ ]) :- !.
skipLastItem([H|T],[H|S]) :-
skipLastItem(T,S).
答案 0 :(得分:3)
这听起来像是家庭作业,所以我在这里会有点模糊......
从更换列表中的一个值的简单问题开始。写一个递归谓词
swap_list(X,N,A,B,Y)
应该读作“对于列表X,在位置N,删除值A并将其替换为B给出列表Y”。
现在我们可以将其扩展到矩阵的情况。写第二个递归谓词
swap_matrix(X,M,N,A,B,Y)
应该被理解为“对于矩阵X,在位置(M,N),去除元素A并用B替换它给出矩阵Y”。此递归的基本情况(M=0
将包含对swap_list
的调用。
现在,您可以使用以下内容交换两个位置(M1,N1)和(M2,N2):
swap(X,M1,N1,M2,N2,Y) :-
swap_matrix(X,M1,N1,A,B,Z),
swap_matrix(Z,M2,N2,B,A,Y).
请注意,我们会先将B
插入矩阵Z
,然后才知道它是什么 - 在第二次swap_matrix
调用之前,B未分配值。