-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