2017-11-13 2 views
1

목록에있는 모든 숫자를 세 심하게 집계하는 프로그램이 필요합니다. 나는 그들이 다른 목록 안에 있지 않은 경우 숫자를 집계 할 수 있었지만 깊게 중첩 된 요소를 통해 반복하는 것은 효과가 없습니다. 나는 지금까지이 : 나는 count([a,1,[2,b],3],N)를 호출한다면프롤로그는 목록의 숫자를 반복적으로 계산합니다.

count([],0). 
count([H|Tail], N) :- 
    count(Tail, N1), 
    ( number(H) 
    ->N is N1 + 1 
    ; is_list(H) 
    -> count(H,N) 
    ; N = N1 
    ). 

따라서, 출력이 N=3해야한다; 그러나 나는 N=2 만받습니다. 누군가 제 2 케이스 테스트에 도움을 주시겠습니까? 여기서 사용 가능한 모든 솔루션은 깊이 중첩 된 숫자 요소에 대해서는 작동하지 않습니다.

감사합니다.

+0

방금로 시작하는 목록을 평평하게 할 수 없습니다, 그 다음의 숫자를 계산? – RoadRunner

+0

아니요, 저는 flatten으로 솔루션을 시도했지만 중첩 된 하위 목록에 대해 재귀를 사용해야하기 때문에 "낙심"했습니다. –

답변

3

귀하의 코드는 is_list(H) 지점에 대한 잘못된 :이 경우에 당신이, 당신이 NH에 카운트 N1의 합계가되고 싶어요 정확하지 N1의 값을 무시합니다.

전체 코드 :

:- 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 
    ). 
+0

답변 해 주셔서 감사합니다. 그것은 당신이 언급 한 모듈과 함께 작동합니다. 그러나, 나는 외부 모듈없이이 작업을 수행하고 # = 연산자를 대체하려고했습니다. clpfd 모듈을 살펴보면이 연산자가 _is_ 연산자와 비슷하다는 것을 알게되었습니다. 그러나 _is_ 연산자를 사용할 때 변수를 인스턴스화해야합니다. 이 문제를 해결할 방법이 있습니까? –

+0

@AbhishekRauniyar'# ='를'is'로 바꾸고'N # = N1 + N2' 행을'count (H, N2)'행으로 바꾸십시오. (그리고 분명히 모듈을 제거하십시오) – Fatalize

+0

감사합니다! 이것은 많은 도움이되었습니다! –

관련 문제