[英]Prolog Recursion removing elements at index that is multiples of n from a list where n is any number
這是我第一次在這里問一個問題,但我有一個問題,我真的無法理解這是Prolog遞歸,特別是當它處理列表時。 所以我應該解決的任務是寫一個像這樣工作的drop謂詞。 例如, drop([1,2,3,4,5,6,7,8,9], 2, L)
其中L = [1,3,5,7,9]
和N=n
,其中元素在位置n,2n,3n ....將被刪除。 列表從1開始是另一件需要注意的事情。
這是我迄今為止的嘗試和思考過程:
drop([], _, []).
indexOf([X|_], X, 1). %Using 1 because the question says the first element starts from 1.
indexOf([_|Ys], Y , I):-
indexOf(Ys, Y, N),
I is N + 1.
drop([X|Xs], Y, [X|_]) :-
indexOf([X|Xs] , X , A),
Z is A mod Y,
Z \== 0.
drop([X|Xs], Y, Zs) :-
%indexOf([X|Xs], X, A),
drop(Xs, Y, Zs).
我創建了一個indexOf
謂詞來查找從1開始的元素的索引。 接下來,我的想法是使用我的第一個drop遞歸情況(在上面的代碼中是第5個案例)來檢查並查看元素的位置在除以Y
(第二個輸入)時是否返回零的余數。 如果它沒有返回零的余數,則X
保留在列表中並且不會被刪除。 然后,prolog移動到第二個drop遞歸情況,只有當Z=0
它才會到達,並且它將從列表中刪除X
以返回Z
s。 本質上,如果在除以Y
(第二個輸入)時沒有返回零的余數,則indexOf
返回的索引為n,2n,3n ...的indexOf
將被刪除。
目前我還沒有在課程的這一點上學過Cut。 如果有人能指出我正確的方向,我將不勝感激。 我已經在這方面工作了將近一天。
我仍然試圖在這種編程范式中調整邏輯和陳述性思維。 如果您能與我分享,我將不勝感激,您是如何親自掌握邏輯編程的?
首先,看看你的方法,使用indexOf/3
有一個缺陷。 也就是說,在您需要知道要移除的內容的索引的給定時間點,在您到達之前,您不知道該項目是什么。 此時,索引為1
。
這是以下規則的一個問題:
drop([X|Xs], Y, [X|_]) :-
indexOf([X|Xs], X, A),
Z is A mod Y,
Z \== 0.
第一個子查詢: indexOf([X|Xs], X, A)
在第一次嘗試時將成功A = 1
,只是按照定義(當然, X
在列表[X|Xs]
有索引1
成功時,然后下一行Z is A mod Y
1
因為如果Y > 0
則1 mod Y
總是1
因此,在這種情況下, Z \\== 0
總是成功。
因此,您得到結果: [X|_]
其中X
是列表的第一個元素。 所以你得到的第一個解決方案就是drop([1,2,3,4], 2, L).
是L = [1|_]
。 你的第三個drop/3
謂詞子句只是遞歸到列表中的下一個元素,那么它將以相同的方式接替第二個子句,產生, L = [2|_]
,依此類推......
從頂部開始,這是一種思考像這樣的問題的方法。
輔助謂詞
我知道我想要刪除每個第N
個元素,所以有一個計數器是有幫助的,這樣每次到達N
我都會忽略該元素。 這是通過輔助謂詞drop/4
來完成的,除了原始N
之外還有一個重復計數器:
drop(L, N, R) :-
drop(L, N, 1, R). % Start counter at 1
基本規則
如果我從空列表中刪除任何元素,我會得到空列表 。 我放棄的元素並不重要。 這表達為:
drop([], _, _, []).
您已經正確表達了此規則。 以上是4參數版本。
遞歸規則1 - 第N
個元素
我有列表[X|Xs]
, X
是第N
個元素索引,如果我跳過X
,結果是R
,將我的索引計數器重置為1
,並從Xs
刪除第N
個元素 :
drop([_|Xs], N, N, R) :- % I don't care what the element is; I drop it
drop(Xs, N, 1, R).
遞歸規則2 - 除第N
個元素之外
我有列表[X|Xs]
, X
是第A
個元素(< N
),如果我遞增索引計數器( A
),結果是[X|R]
,並從我的Xs
刪除第N
個元素更新索引計數器 :
drop([X|Xs], N, A, [X|R]) :-
A < N,
NextA is A + 1,
drop(Xs, N, NextA, R).
這些都是所需的規則(其中4個)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.