以下代码将在prolog列表中执行反向:
rev([], []).
rev([X|Xs], Ys) :- rev(Xs, Zs), append(Zs, [X], Ys).
我不知道为什么会有效,虽然以下是我的理解,但我希望进一步澄清。
基本情况表明空列表会导致空列表。
我不知道此后发生了什么。为什么要调用append函数?
答案 0 :(得分:0)
第一步是了解append(Zs, [X], Ys)
何时为真。它说:当您将项目[X]
添加到列表Zs
的末尾并且结果等于Ys
时,确实如此。
如果rev(Xs, Zs)
是Zs
的反转列表,则Xs
为真。
因此,当您反转列表Ys
然后将[X|Xs]
附加到反转列表的末尾时,整个算法说Xs
是[X]
的反转列表。
在某些过程语言中,您可以使用以下代码编写相同的算法:
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;
}