在給出的示例中,reverse1
未使用真正的差異列表,而僅僅是reverse2
的不同表示形式。他們都以相同的方式使用相同的變量。 reverse
使用一個-
仿函數來附加它們,並且reverse2
將它們保持爲單獨的參數。但是這兩者之間的差別就在這裏。算法行爲是相同的。
一個真正的差分列表是一個列表結構與其中T
沒有(在時間直到稍後點也許)實例化在其中的「洞」,像X-T
,並X
包含T
(例如,[a,b,c|T]-T
)。這個函子中的-
將「暴露的」未被證實的變量與包含它的結構聯繫起來。
一個流行的簡單例子是使用差異列表的append
的實現。一個傳統的,遞歸執行append
可能是這樣的:
append([], Ys, Ys).
append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs).
足夠簡單,而且執行時間是成正比的第一列表的長度。
使用差異表,您可以按如下實施append
:
append(A-B, B-C, A-C).
這就是你需要追加使用差異表列表。沒有遞歸或其他任何東西。執行時間爲O(1)
,與列表長度無關。下面是一個例子執行:
append([1,2,3|T]-T, [4,5,6|W]-W, DL).
產量:
DL = [1,2,3,4,5,6|W]-W
T = [4,5,6|W]
您可以通過「填充」孔與最後一個參數一個空列表得到具體的答案:
append([1,2,3|T]-T, [4,5,6|W]-W, L-[]).
您將獲得:
L = [1,2,3,4,5,6]
T = [4,5,6]
W = []
感謝所有爲及時解答。 –