代码之家  ›  专栏  ›  技术社区  ›  TubaShark

是否在Prolog中的字符后计算列表中特定元素的出现次数?

  •  1
  • TubaShark  · 技术社区  · 6 年前

    所以我相信这段代码很接近,但我想我在数数的时候把它弄糟了 w '在列表中仅在' b '而不是之前。例如 h1([w,w,b,w,b,b],H) 将成功 H=1 .

    编辑:我相信我的基本情况是正确的。但是第二部分的递归是错误的。

    h1([], 0).
    h1([b|T], Count) :-
        h1(T, TCount),
        Count is TCount + 1.
    

    我觉得我离它很近了。P、 因为我不确定该放什么,但目前正在尝试一些事情。

    h1([H|T], Count) :-
        "" \== H,
    h1(T, Count).
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   G_V    6 年前

    您要做的是逐步遍历列表中的每个元素,检查它是否是您的条件字符,然后计数元素并将其返回给您的调用。

    forFirstBCountW(List, Count) :- detect_b(List, Count).
    
    detect_b([], _).
    detect_b([b|T], Count) :- count_w(T, 0, Count), !.
    detect_b([_|T], Count) :- detect_b(T, Count).
    
    count_w([], TotalCount, TotalCount) :- !.
    count_w([w|T], CurrentCount, TotalCount) :- 
       NewCount is CurrentCount + 1,
       count_w(T, NewCount, TotalCount).
    count_w([_|T], NewCount, TotalCount) :- 
       count_w(T, NewCount, TotalCount).
    

    我真的可以推荐阅读 Learn Prolog Now! 要了解Prolog背后的概念,它是一种功能强大得惊人的语言。

    编辑:为了清晰起见,将谓词分隔开,以便它们可以单独重用为 detect_b 并没有明确的名称。我将旧程序留在那里,以便您可以比较它们如何获得相同的结果,同时采取不同的路径:

    forFirstBCountW(List, Count) :- 
       detect_b(List, ListFromB), 
       count_w(ListFromB, 0, Count),
       !.
    
    detect_b([], []).
    detect_b([b|T], T) :- !.
    detect_b([_|T], ReturnList) :- detect_b(T, ReturnList).
    
    count_w([], TotalCount, TotalCount) :- !.
    count_w([w|T], CurrentCount, TotalCount) :- 
       NewCount is CurrentCount + 1,
       count_w(T, NewCount, TotalCount).
    count_w([_|T], NewCount, TotalCount) :- 
       count_w(T, NewCount, TotalCount).
    

    这可以进一步抽象,这就是Prolog如此有趣的原因:

    forFirstBCountW(List, Count) :- 
       splitListOnChar(b, List, ListFromB), 
       count_Char(w, ListFromB, 0, Count), 
       !.
    
    splitListOnChar(_, [], []).
    splitListOnChar(Char, [Char|T], T) :- !.
    splitListOnChar(Char, [_|T], ReturnList) :- 
       splitListOnChar(Char, T, ReturnList).
    
    count_Char(_, [], TotalCount, TotalCount) :- !.
    count_Char(Char, [Char|T], CurrentCount, TotalCount) :- 
       NewCount is CurrentCount + 1,
       count_Char(Char, T, NewCount, TotalCount).
    count_Char(Char, [_|T], NewCount, TotalCount) :- 
       count_Char(Char, T, NewCount, TotalCount).
    
        2
  •  0
  •   tudatn    6 年前

    您的语法不是“Prolog”。您可能需要阅读一些基本文档来了解prolog语法的更多信息。

    因为prolog不使用循环,而是使用递归,我建议使用一种非常直观的递归思维:

    • 基本情况:空列表
    • 基本情况:b是列表的开头,然后只计算列表其余部分的w数。
    • 递归情况:b不是头,然后只调用列表其余部分的函数。

    我确信还有其他优雅的方法来解决这个问题。玩得高兴