逐步帮助递归

时间:2015-01-13 18:40:40

标签: recursion prolog

我去了很多在线文本教程,问我的老师,试图通过问题来获得更全面的递归知识,但是我仍然在努力理解如何实现它。我理解这个定义,因为它涉及一个调用自身的函数,以及它用于以更紧凑的方式更有效地编写代码的某些部分的事实。

我特别难以理解递归的工作原理以及如何实现递归以查看列表中的项目。对于给我们的问题集,我们需要使用递归来查找列表中的特定项。令我困惑的部分是列表的[H | T]部分,以及如何列出符合条件的项目并将它们列在新列表中。

有没有人请给我一个小例子,每个步骤都说明我可以作为指导,试图独立地弄清楚我的问题集。这真的很有帮助,通过阅读成为Prolog的新手我知道这是一项至关重要的技能,我需要掌握才能更有效地使用该语言。

你的帮助会很棒。

1 个答案:

答案 0 :(得分:0)

Prolog中的列表是一个非常简单的数据结构:

  • 空列表是prolog atom []
  • 非空列表是序言.(H,T),其中
    • H是列表开头的列表项,
    • 'T'是列表的尾部,这是另一个序言列表。

最后一个列表节点的尾部 - 最里面的列表节点,如果你想以那种方式查看它 - 是空列表。其他一切都是非空列表。

Prolog的列表方括号([a,b,c])只是上述数据结构的合成糖。

  • []是空列表
  • [a]完全等同于.(a,[])
  • [a,b]完全等同于.(a,.(b,[]))
  • [a,b,c]完全等同于.(a,.(b,.(c,[])))
  • 等等(人们很容易理解为什么人们可能更喜欢./2符号上的方括号表示法。)

Head / Tail运算符|只是更多的语法糖:

  • [H|T]完全等同于.(H,T)

当我说完全等同于时,我的意思是一致。如果你说像

这样的话
[A,B,C] = .(a,.(b,.(c,[])))

它将评估为true(成功),您将获得

A = a, B = b , C = c

所以,这是一个简单的,带注释的列表遍历示例:

member_of_list(_,[])      :- % the empty list has no members.
  fail.                      % - so we fail (Note that this clause is redundant, since it will fail appropriately without it.)
member_of_list(X,[X|Xs] ).   % X is a member of the non-empty list, if it is found at the head of the list.
member_of_list(X,[_|Xs] ) :- % otherwise, we discard the head of the list, and
  member_of_list(X,Xs).      %  recurse down on the tail of the list.

如果您在调试器中完成它,或者添加一些日志记录,这可能会有所帮助,这样您就可以看到正在发生的事情。