我试图找到一个值score
,它可以从两个相等长度的列表中强制计算Xs, Ys
为:
for i in len(Xs):
if Xs[i] == Ys[i]:
score++
else:
score--
所以这个想法是基本上从左到右检查两个列表中的每个元素,如果这些元素相同,则增加分数,否则减少分数。例如:
score([1,2,3], [1,2,3]) == 3
score([1,2,3], [1,2,1]) == 1
score([1,2,3], [3,2,1]) == -1
score([1,2,3], [3,1,2]) == -3
我想我实际上设法将程序编写为:
score(Xs, Ys, C) ?=>
Xs = [], Ys = [], C = 0.
score(Xs, Ys, C) =>
Xs = [XH|XT],
Ys = [YH|YT],
if (XH #= YH) then
C #= C1 + 1
else
C #= C1 - 1
end,
score(XT, YT, C1).
当我查询分数时,代码给出了正确的结果:
score([1,2,3], [1,2,3], S).
S = 3 ?;
score([1,2,3], [1,2,1], S).
S = 1 ?;
score([1,2,3], [3,2,1], S).
S = -1 ?;
score([1,2,3], [3,1,2], S).
S = -3 ?;
但是,当我尝试生成产生分数的列表时,代码只生成分数为 3 的相同列表:
S :: -3..3, Ls = new_list(3), Ls :: 1..3, score([1,2,3], Ls, S), solve([Ls, S]).
S = 3
Ls = [1,2,3] ?;
no
我想生成所有列表,对应于所有可能的分数,我觉得我必须修改基本情况,但我不知道如何:)
编辑:我也尝试做一个尾递归类型的解决方案,它在查询分数时再次给出正确的结果,但它只能生成相同的列表。
score(Xs, Ys, C) ?=>
score_helper(Xs, Ys, 0, C).
score_helper([], _, Cur, C) ?=>
C = Cur.
score_helper(Xs, Ys, Cur, C) ?=>
Xs = [XH|XT],
Ys = [YH|YT],
if (XH = YH) then
score_helper(XT, YT, Cur+1, C)
else
score_helper(XT, YT, Cur-1, C)
end.