示例:
firstlast([1,2,3,4,1]).
true;
firstlast([1,2,3,4]).
false;
firstlast([5,10,4,3]).
false;
exc...
问题是我只允许使用谓词“firstlast”的递归。 ? 我真的试图打破这个,但我似乎无法检查/比较最后一个元素与第一个元素。
任何提示?
答案 0 :(得分:3)
更新:由于您不允许使用其他谓词,请尝试以下操作:
firstlast([H,H]).
firstlast([F,_|T]) :- firstlast([F|T]).
第一个谓词处理基本情况,第二个谓词删除三个或更多项目列表中的第二个元素,并递归。
答案 1 :(得分:2)
您可能意味着第一个和最后一个元素是相同的。以下是使用dcg的解决方案 - 符号:
firstlast(Xs) :- phrase(([X],...,[X]), Xs). ... --> [] | [_], ... .
我不确定firstlast([1])
是否应该成功......
答案 2 :(得分:0)
好吧,因为您只能使用firstlast / 1的递归,解决方案将如下所示:
firstlast(...) :- ... .
firstlast(...) :- ... .
firstlast(...) :- ... .
....
firstlast(...) :- ... .
其中一些将是关于基本案例的规则,其中一些是“消除”问题的规则。 这个问题需要一个检查:比较第一个和最后一个元素。所以,在你的基础情况下,你应该只有这两个元素;你不需要别的什么。所以解决方案将忽略所有其他元素
最后提示:您可以使用以下统一模式访问列表的2个第一个元素:
foo([H1,H2|T])
答案 3 :(得分:0)
如此公平我得到了这个:
firstlast([H,_|T]) :-
(T1 = H, T1 = T) -> firstlast([H|T]).
我的代码比较了最后一个元素和第一个元素,但递归错误:/
如上所述,不应该允许列表中的一个元素成功。 虽然我只允许使用谓词“firstlast”。