-1
倒車一個簡單的列表下面的代碼將在序言名單上執行反向:在序言
rev([], []).
rev([X|Xs], Ys) :- rev(Xs, Zs), append(Zs, [X], Ys).
我不知道爲什麼它的工作原理,雖然下面是我理解,但我希望進一步澄清。
基本情況表明空列表會導致一個空列表。
我不知道之後發生了什麼。爲什麼它調用append函數?
倒車一個簡單的列表下面的代碼將在序言名單上執行反向:在序言
rev([], []).
rev([X|Xs], Ys) :- rev(Xs, Zs), append(Zs, [X], Ys).
我不知道爲什麼它的工作原理,雖然下面是我理解,但我希望進一步澄清。
基本情況表明空列表會導致一個空列表。
我不知道之後發生了什麼。爲什麼它調用append函數?
第一步是瞭解何時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;
}
爲什麼有人向下投你的答案?我有點得到你在說什麼,這是否是在序言中反轉列表的唯一方法? upvoted和接受的答案。 – user1010101 2014-12-05 01:01:13
我也不知道...不,還有另一種方法如何反轉列表。而且還有更高效的算法,你發佈的算法可能是最天真的,但容易理解,特別是當你對Prolog不熟悉時。 – 2014-12-05 01:08:37