【问题标题】:How to count how many times of a WORD occurs in a List?如何计算一个 WORD 在 List 中出现的次数?
【发布时间】:2009-12-11 19:14:54
【问题描述】:

如何计算一个单词在List中出现了多少次?

例如: counthowmany(hello,[hello,how,are,you,hello,hello],N).

N 给出hello 出现的单词总数。

谢谢

【问题讨论】:

  • 这是作业的味道。
  • 这听起来像是一个合理的问题,任何其他问题都值得回答。
  • UGH*,序言......我记得在这个任务中做狼、山羊、卷心菜的问题......哦,痛苦的记忆!
  • 我认为prolog中没有for循环,它必须是递归
  • 您使用哪种语言?

标签: prolog


【解决方案1】:

这里有一个解决方案:

counthowmany(_, [], 0) :- !.
counthowmany(X, [X|Q], N) :- !, counthowmany(X, Q, N1), N is N1+1.
counthowmany(X, [_|Q], N) :- counthowmany(X, Q, N).

第一行是终止测试:在一个空列表上,计数为零。另外两行是递归调用,如果第一个元素匹配(第 2 行),则计数递增。

这是一个类似但纯粹合乎逻辑的版本(没有剪辑),正如 Darius 所建议的:

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).

【讨论】:

  • 我会在没有任何删减的情况下编写它,而是在最后一个子句中使用不等于测试,因为使用纯逻辑定义不太容易出错。
  • 保留logical-purity 使用dif/2 而不是(\==)/2!有关dif 的更多信息在这里:prolog-dif
【解决方案2】:

tcount/3 与具体化术语相等(=)/3 结合使用,如下所示:

?- tcount(=(hello),[hello,how,are,you,hello,hello],N).
N = 3.                          % succeeds deterministically

【讨论】:

    【解决方案3】:

    这是一个替代实现。这是使用累加器的尾递归。

    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).
    

    【讨论】:

      【解决方案4】:

      更好的回答

      countWord([],0).
      countWord([_|List], A):- countWord(List,B), A is B+1.
      

      【讨论】:

        猜你喜欢
        • 2010-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-07
        • 2016-01-09
        • 2017-09-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多