2014-12-04 29 views
-1

倒車一個簡單的列表下面的代碼將在序言名單上執行反向:在序言

rev([], []). 
rev([X|Xs], Ys) :- rev(Xs, Zs), append(Zs, [X], Ys). 

我不知道爲什麼它的工作原理,雖然下面是我理解,但我希望進一步澄清。

基本情況表明空列表會導致一個空列表。

我不知道之後發生了什麼。爲什麼它調用append函數?

回答

0

第一步是瞭解何時append(Zs, [X], Ys)爲真。它說:當您將項目[X]添加到列表Zs的末尾並且結果等於Ys時,就是如此。

然後rev(Xs, Zs)Zs爲倒數列表Xs時爲true。

所以整個algoritm說,當你扭轉名單Xs然後追加[X]到反向列表的末尾Ys反轉的[X|Xs]名單。

在一些程序上的語言,你可以寫同樣的算法與下面的代碼:

function List<T> Reverse(List<T> items) 
{ 
    if (items.Count == 0) 
     return items; 

    var reversedList = Reverse(items.Skip(1)); 
    reversedList.Add(items.First()); 
    return reversedList; 
} 
+0

爲什麼有人向下投你的答案?我有點得到你在說什麼,這是否是在序言中反轉列表的唯一方法? upvoted和接受的答案。 – user1010101 2014-12-05 01:01:13

+1

我也不知道...不,還有另一種方法如何反轉列表。而且還有更高效的算法,你發佈的算法可能是最天真的,但容易理解,特別是當你對Prolog不熟悉時。 – 2014-12-05 01:08:37