Prolog递归地计算列表中的数字
Prolog recursively count numbers in a list
我需要一个程序来计算列表中的所有数字,无论它们嵌套得有多深。在数字不在另一个列表中的情况下,我能够对数字进行计数,但是通过深度嵌套的元素进行递归是行不通的。到目前为止我有这个:
count([],0).
count([H|Tail], N) :-
count(Tail, N1),
( number(H)
->N is N1 + 1
; is_list(H)
-> count(H,N)
; N = N1
).
所以,如果我调用 count([a,1,[2,b],3],N)
,输出应该是 N=3
;但是,我只得到 N=2
。有人可以帮我添加到我的第二个案例测试中吗?此处所有可用的解决方案都不适用于深度嵌套的数字元素。
谢谢!
您的 is_list(H)
分支代码不正确:在这种情况下,您忽略了 N1
的值,这是不正确的,您希望 N
是 N1
计数 H
.
完整代码:
:- use_module(library(clpfd)).
count([], 0).
count([H|T], N) :-
count(T, N1),
( number(H) ->
N #= N1 + 1
; is_list(H) ->
N #= N1 + N2,
count(H, N2)
; N1 = N
).
我需要一个程序来计算列表中的所有数字,无论它们嵌套得有多深。在数字不在另一个列表中的情况下,我能够对数字进行计数,但是通过深度嵌套的元素进行递归是行不通的。到目前为止我有这个:
count([],0).
count([H|Tail], N) :-
count(Tail, N1),
( number(H)
->N is N1 + 1
; is_list(H)
-> count(H,N)
; N = N1
).
所以,如果我调用 count([a,1,[2,b],3],N)
,输出应该是 N=3
;但是,我只得到 N=2
。有人可以帮我添加到我的第二个案例测试中吗?此处所有可用的解决方案都不适用于深度嵌套的数字元素。
谢谢!
您的 is_list(H)
分支代码不正确:在这种情况下,您忽略了 N1
的值,这是不正确的,您希望 N
是 N1
计数 H
.
完整代码:
:- use_module(library(clpfd)).
count([], 0).
count([H|T], N) :-
count(T, N1),
( number(H) ->
N #= N1 + 1
; is_list(H) ->
N #= N1 + N2,
count(H, N2)
; N1 = N
).