2014-12-04 36 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