我有一个需要构造的谓词 repeat/3。它应该将列表中的所有元素重复 n 次。例如:
会产生以下结果: X = [a,a,b,b,a,a,a,a,c,c]。
我为此编写的当前代码如下:
它将返回:
1)当给出一个空列表时,返回一个空列表。
2)当给出数字0作为参数时,返回一个空列表。
3)一封信n次。
4)给定的列表一次。
现在,我遇到的问题是代码的最后一行。
5)目前这行代码会将第一个元素重复n次后,返回列表中的所有元素。
示例:
我觉得解决方案是我要遍历列表,对于每个元素重复n次,但我不知道该怎么做。
我尝试过的一个想法是,在传递给谓词的数字达到1时将其转换回原始数字,然后使用尾部继续谓词:
这没有成功。我现在不知道我是否在正确的轨道上。任何帮助都将不胜感激。
?- repeat([a,b,a,a,c],2,X).
会产生以下结果: X = [a,a,b,b,a,a,a,a,c,c]。
我为此编写的当前代码如下:
repeat([],_,[]).
repeat(_,0,[]).
repeat([A],Int,[A|X]):- Int1 is Int-1, repeat([A],Int1,X).
repeat(A,1,A).
repeat([A|Tail],Int,[A|X]):- Int1 is Int-1, repeat([A|Tail],Int1,X).
它将返回:
1)当给出一个空列表时,返回一个空列表。
2)当给出数字0作为参数时,返回一个空列表。
3)一封信n次。
4)给定的列表一次。
现在,我遇到的问题是代码的最后一行。
5)目前这行代码会将第一个元素重复n次后,返回列表中的所有元素。
示例:
?- repeat([a,b,b,c],3,X).
X = [a, a, a, b, b, c]
我觉得解决方案是我要遍历列表,对于每个元素重复n次,但我不知道该怎么做。
我尝试过的一个想法是,在传递给谓词的数字达到1时将其转换回原始数字,然后使用尾部继续谓词:
repeat([],_,[]).
repeat(_,0,[]).
repeat([A],Int,[A|X]):- Int1 is Int-1, repeat([A],Int1,X).
repeat([A|Tail],1,[A|X]):- repeat(Tail,Int,X). % The line where I made a change.
repeat([A|Tail],Int,[A|X]):- Int1 is Int-1, repeat([A|Tail],Int1,X).
这没有成功。我现在不知道我是否在正确的轨道上。任何帮助都将不胜感激。
N
次,接下来的项目只重复一次。这是因为您会递减N
直到达到零。但是,此时不再有关于原始N
的信息。 - Willem Van Onsem[A]
这些情况;你不需要它们,它们是不必要的边缘情况。[A|Tail]
与[a]
统一绑定A=a, Tail=[]
。此外,我建议使用succ(Int1, Int)
而不是Int1 is Int-1
,因为它可以双向成功。 - Daniel LyonsN
和一个你要递减的N
。从递减计数器达到零的那一刻起,你就可以继续处理源列表中的下一个元素,并使用你传递的N
重置该计数器。 - Willem Van Onsem