例子:
firstlast([1,2,3,4,1]).
true;
firstlast([1,2,3,4]).
false;
firstlast([5,10,4,3]).
false;
exc...
问题在于我只被允许使用带有谓词"firstlast"的递归?我真的尝试过打破这个限制,但似乎无法检查/比较最后一个元素和第一个元素。
有什么提示吗?
更新: 由于不允许使用其他谓词,因此请尝试以下方法:
firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).
第一个谓词处理基本情况,第二个谓词删除三个或更多项列表中的第二个元素,并进行递归。
firstlast(Xs) :- phrase(([X],...,[X]), Xs).我不确定
... --> [] | [_], ... .
firstlast([1])
是否应该成功...由于您只能使用firstlast/1进行递归,因此解决方案将如下:
firstlast(...) :- ... .
firstlast(...) :- ... .
firstlast(...) :- ... .
....
firstlast(...) :- ... .
其中一些规则将涉及基本情况,而另一些规则将“消耗”问题。
这个问题需要进行一次检查:比较第一个和最后一个元素。因此,在您的基本情况中,您应该只有这两个元素;您不需要其他任何东西。因此,解决方案将忽略所有其他元素。
最后的提示:您可以使用以下统一模式访问列表的前两个元素:
foo([H1,H2|T])
到目前为止我得到了这个:
firstlast([H,_|T]) :-
(T1 = H, T1 = T) -> firstlast([H|T]).
我的代码比较最后一个和第一个元素,但递归算法有问题 :/
如上所述,不应允许在列表中只有一个元素的情况下成功。 尽管我只被允许使用谓词“firstlast”。
Xs = [f,Xs], firstlast(Xs).
成功了。这是预期的吗? - falsefalse
,我有什么遗漏吗?(注意:我编辑了我的答案,第一行有一个错别字 - 它说的是last(X,list)
而不是last(X,List)
) - Sergey Kalinichenkofirst(H, H).
。 - false