2016-09-24 2 views
1

나는 Prolog를 처음 사용하고이 연습 연습을 경험했습니다. 질문은 목록 2는 목록 1의 첫 번째 항목 이후 모든 N 번째 요소 항목 다음에 첫 번째 항목을 포함Prolog 목록에서 N 요소 건너 뛰기

everyNth(N, List1, List2) 

되도록 조건을 정의하는 요구하고있다.

힌트는 추가와 길이를 사용하는 것입니다. 예를 들어

,

everyNth (3, [1,2,3,4,5,6,7], List2). 
List2 = [1,4,7]. 

everyNth (2, [1,2,3,4,5,6], List2). 
List2 = [1,3,5]. 

나는이 문제를 이런 식으로 접근하고 지금까지이 내가 가진 전부입니다 : 확실하지 내가 올바른 방향으로 향하고있다합니다.

everyNth(N, [], L1). 
everyNth(N, [H|NL], RL) :- 
    N > 0,length(NL,N),append(H, NL, RL),everyNth(N,NL,RL). 

어떤 제안이나 요령이 도움이 될 것입니다!

감사합니다.

답변

2

나는

everyNth(_, _, [], []). 

everyNth(N, N, [H | Ti], [H | To]) :- 
    everyNth(N, 1, Ti, To). 

everyNth(N, C, [_ | Ti], Lo) :- 
    C < N, 
    Cp1 is C+1, 
    everyNth(N, Cp1, Ti, Lo). 

everyNth(N, Li, Lo) :- 
    everyNth(N, N, Li, Lo). 

난 당신이 개 사용하는 두 개의 숫자가 필요하다고 생각하는 다음과 같은 솔루션을 제안한다 : 첫 번째는 N이고 고정되어; 두 번째, C1으로 시작하여 N에 도달하고 1에서 다시 시작하는 커넥터입니다. 등등. 따라서 everyNth/3 절은 everyNth/4 버전 만 호출합니다. N을 카운터로 사용하여 입력 목록의 첫 번째 요소를 복사하십시오. C는 (제 everyNth/4) N 같을 때

, 넌 출력리스트 헤더로서 입력리스트 (H)의 헤더를 복사; 그렇지 않으면 당신은 그것을 버리게됩니다.

출력 목록 초기화 ([]) 끝 문구 (everyNth(_, _, [], []).)가 필요합니다.

1

다음과 같이 시도해보십시오.

first_and_every_nth_item(_ , []  , [] ) . % empty list? Easy! 
first_and_every_nth_item(N , [X|Xs] , [X|Ys]) :- % take the first item 
    every_nth_item(1,N,Xs,[],Ys)      % then take every nth item from the remainder. 
    . 

every_nth_item(_,_,[],Ts,Ys) :-  % if the source list is exhausted, we're good. 
    reverse(Ts,Ys)      % just reverse the accumulator to get the result 
    .         % 
every_nth_item(N,M,[_|Xs],Ts,Ys) :- % otherwise... 
    N < M ,       % - if N < M 
    N1 is N+1 ,      % - increment N 
    every_nth_item(N1,M,Xs,Ts,Ys)  % - and recurse down, discarding the head of the source list. 
    . 
every_nth_item(N,M,[X|Xs],Ts,Ys) :- % otherwise 
    N = M ,       % - if N = M 
    T1 = [X|Ts]      % - prepend X to the accumulator 
    every_nth_item(1,M,Xs,T1,Ys)  % - recurse down with the count restarted 
    .         %