如何統計列表中出現WORD的次數?如何統計列表中出現WORD的次數?
例如: counthowmany(hello,[hello,how,are,you,hello,hello],N)
。
N
給出的單詞總數hello
發生。
由於
如何統計列表中出現WORD的次數?如何統計列表中出現WORD的次數?
例如: counthowmany(hello,[hello,how,are,you,hello,hello],N)
。
N
給出的單詞總數hello
發生。
由於
這裏是一個解決方案:
counthowmany(_, [], 0) :- !.
counthowmany(X, [X|Q], N) :- !, counthowmany(X, Q, N1), N is N1+1.
counthowmany(X, [_|Q], N) :- counthowmany(X, Q, N).
第一行是終止測試:一個空的列表中,則計數爲零。另外兩行是遞歸調用,如果第一個元素匹配(第2行),則計數遞增。
這裏是一個類似的,但純邏輯的版本(沒有切割),如通過大流士建議:
counthowmany(_, [], 0).
counthowmany(X, [X|Q], N) :- counthowmany(X, Q, N1), N is N1+1.
counthowmany(X, [Y|Q], N) :- X \== Y, counthowmany(X, Q, N).
我會在沒有任何削減的情況下寫入它,而不是使用最後一個子句中的不等於測試,因爲純粹邏輯定義不太容易出錯。 – 2009-12-12 07:47:38
使用'dif/2'而不是'(\ ==)/ 2'保留[tag:logical-purity]!更多關於'dif'的信息在這裏:[tag:prolog-dif] – repeat 2015-10-07 02:05:28
這裏是一個替換的實施方式。這是使用累加器的尾遞歸。
countwords(X,L,N) :- countwords(X,L,0,N),!.
countwords(X,[],N,N).
countwords(X,[X|T],P,N) :- P1 is P+1 , countwords(X,T,P1,N).
countwords(X,[H|T],P,N) :- X\==H , countwords(X,T,P,N).
使用meta-predicatetcount/3
亦隨像這樣具體化的長期平等(=)/3
:
?- tcount(=(hello),[hello,how,are,you,hello,hello],N).
N = 3. % succeeds deterministically
一個甚至aswer
countWord([],0).
countWord([_|List], A):- countWord(List,B), A is B+1.
這氣味功課好。 – CAbbott 2009-12-11 19:16:26
這是一個合理的問題,作爲任何其他值得一個答案的氣味。 – Marcelo 2009-12-11 19:18:55
UGH *,prolog ...我記得在這裏做狼,山羊,白菜問題作爲一項任務......哦,痛苦的回憶! – Zoidberg 2009-12-11 19:22:26