我需要编写一个程序,该程序将基于图的表示创建一个邻接表,以邻接矩阵的形式给出。
示例
input-包含元素列表的列表
[[0,1,1],[1,0,1],[1,1,0]].
输出
[[0,2,3],[1,0,3],[1,2,0]]
我已经尝试过这个了:
indexof(Index, Item, List):-
nth1(Index, List, Item).
replace(I, L, E, K) :-
nth1(I, L, _, R),
nth1(I, K, E, R).
f([], []).
f([H|Tail], [Z|RezTail]):-
member(E,H),
E =:= 1,
indexof(X, E, H),
replace(X, H, X, Z),
f(Tail, RezTail).
输入-f([[0,1,1],[1,0,1],[1,1,0]], Z).
输出-Z = [[0, 2, 1], [1, 0, 1], [1, 1, 0]]
如您所见,问题是找到第一个“ 1”后,程序将递归并跳过列表中的其他项。有什么办法可以避免这种情况?
答案 0 :(得分:2)
怎么样
fh([], [], _).
fh([0|T1], [0|T2], I) :-
Ip is I+1,
fh(T1, T2,Ip).
fh([_|T1], [I|T2], I) :-
Ip is I+1,
fh(T1, T2, Ip).
f([], []).
f([H1|T1], [H2|T2]) :-
fh(H1, H2, 1),
f(T1, T2).
如此:
?- f([[0,1,1],[1,0,1],[1,1,0]],X).
评估为:
X = [[0, 2, 3], [1, 0, 3], [1, 2, 0]]