List 确定列表中的元素数是否为偶数而不计数
我必须在不计算元素的情况下确定列表中元素的数量是否为偶数。 这是一个我需要在Prolog中解决的问题,所以我想这个解决方案应该是递归的。List 确定列表中的元素数是否为偶数而不计数,list,recursion,prolog,List,Recursion,Prolog,我必须在不计算元素的情况下确定列表中元素的数量是否为偶数。 这是一个我需要在Prolog中解决的问题,所以我想这个解决方案应该是递归的。 我在考虑计算所有元素的频率,然后将它们全部相加,但我不确定这是否是一个好主意。这是不需要计算的: list_even_length(List, Len) :- length(List, Len), Len rem 2 =:= 0. 如果你的意思是“没有算术”,这是不一样的。您可以看到如何在偶数位置跳过所有元素的示例。您需要做的事情要简单得多:
我在考虑计算所有元素的频率,然后将它们全部相加,但我不确定这是否是一个好主意。这是不需要计算的:
list_even_length(List, Len) :-
length(List, Len),
Len rem 2 =:= 0.
如果你的意思是“没有算术”,这是不一样的。您可以看到如何在偶数位置跳过所有元素的示例。您需要做的事情要简单得多:一次只使用一个列表中的两个元素。这是一个纯粹的、具体化的版本:
evenlength_t([], true).
evenlength_t([_|Xs], T) :-
i_evenlength_t(Xs, T).
i_evenlength_t([], false).
i_evenlength_t([_|Xs], T) :-
evenlength_t(Xs, T).
它将给出true
或false
作为实际列表的第二个参数,对于既不是列表也不是部分列表的术语,它将失败。具体化谓词可以用作单调性的条件
以下更直接的版本无法区分非列表和奇数长度的列表:
evenlength([]).
evenlength([_,_|Xs]) :-
evenlength(Xs).
作为一个缺点,两个版本都会循环使用所谓的无限列表。您应该在这里展示一些尝试。但是,作为一个很大的提示:请考虑<代码> >,>代码>是一个至少有两个元素的列表。而且,
[]
是0个元素的列表,这是偶数。您可以在递归解决方案中充分利用这一点。:)不清楚你所说的“不计算”是什么意思。必须有某种计数:毕竟,“偶数”是用自然数来定义的。计算频率会有什么帮助?使用列表的长度并检查它是否相等就足够了吗?调用length/2
会计算列表中的元素。@PauloMoura对其进行任何形式的迭代。@PauloMoura的观点是,length/2
实际上实现了一个计数器,然而,有一些替代方案可以循环到最后而不必计算,并且可以通过循环的最终状态来确定均匀性。@潜伏者,我明白你的意思,我同意保罗的观点,但这感觉像是一个技术问题。您当然知道,只要用[]
替换0,用X
和[\u124; X]
替换n和n即可:我们是在计算自然数还是在列表中迭代?是的,这是一个技术问题。语义:)