簡體   English   中英

反轉序言中列表的項目順序

[英]Reversing the item order of a list in prolog

有人可以向我解釋以下代碼:

t(L, NL) :-
    t(L, [], NL).
t([], L, L). 
t([H|T], A, NL) :-
    t(T, [H|A], NL).

我會以完全不同的方式實現它:

s([], []). 
s([H|T], NL) :-
    s(T, NT),
    append(NT, [H], NL).

您使用累加器,即第二個參數。 最初這被設置為空列表,確實:

t(L, NL) :-
    t(L, [], NL).  % ← empty list

然后我們每次都對第一個參數進行模式匹配。 如果它為空,我們將累加器作為反向列表返回:

t([], L, L).  % ← list empty? Unify the accumulator L with the result (third parameter)

如果列表不為空,我們將使用[H|T]進行統一,所以H是第一個列表, T是剩余元素的列表,我們在累加器前面加上H

t([H|T], A, NL) :-
    t(T, [H|A], NL).  % ← prepend H to the accumutor.

如果我們有一個列表[1,4,2,5]我們每次都會在累加器前面加上列表的頭部並在尾部遞歸,所以它看起來像:

 list (L)  | accumulator (A)
-----------------------------
 [1,4,2,5] |              []
 [4,2,5]   |             [1]
 [2,5]     |           [4,1]
 [5]       |         [2,4,1]
 []        |       [5,2,4,1]

所以當我們最終在L空的情況下調用t/3謂詞時,累加器包含反向列表。

這樣做的好處是它是有效的:前置需要O(1)時間,就像與[H|T]統一一樣,所以這意味着我們在O(n)時間內反轉。

append/3在第一個參數的長度上需要線性時間,因此通過在此處使用append/3 ,您可以在O(n 2 )時間內獲得相反的時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM