【发布时间】:2023-12-28 09:05:01
【问题描述】:
我想在 prolog 中编写一个尾递归程序:count_neg(Ls, N, R) 如果Ls 是整数列表并且N 是负元素的数量,则这是正确的。 R 应该代表非负元素的列表。
一个例子:
count_neg([1,-2,0,1,2,-3],N,R).
N = 2,
R = 4.
这是我目前编写的代码:
count_neg(Ls, N, R) :- count_neg(Ls, 0, 0, N, R).
count_neg([L|Ls], Cnt1, Cnt2, N, R) :- (L > 0 -> C1 is Cnt1 + 1, !; L < 0 -> C2 is Cnt2 + 1, !), count_neg(Ls, C1, C2, N, R).
count_neg([], Cnt1, Cnt2, N, R) :- N is Cnt1.
count_neg([], Cnt1, Cnt2, N, R) :- R is Cnt2.
问题是,N 和 R 都在开头初始化为 0,这是正确的,但是当程序应该计算第一个负数时,它不是从零开始计数,而是从 _21532 开始计数,结果为一个错误:
有人知道这里出了什么问题吗?我也想在我的程序中使用 Cuts。
【问题讨论】:
-
为什么全部删减?
标签: prolog tail-recursion