【问题标题】:Step By Step Help For Recursion递归的逐步帮助
【发布时间】:2015-01-15 02:38:24
【问题描述】:

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

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

谁能给我一个解释每个步骤的小例子,我可以用它作为指导来尝试独立解决我的问题。这真的很有帮助,通过阅读成为 Prolog 的新手提前我知道这是我需要掌握的一项重要技能,才能更有效地使用该语言。

您的帮助会很棒。

【问题讨论】:

  • 我看到的最好的解释在这本书里:Clause and Effect: Prolog Programming for the Working Programmer

标签: recursion prolog


【解决方案1】:

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

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

最后一个列表节点的尾部——最里面的列表节点,如果你想这样看的话——是空列表。其他所有内容都是非空列表。

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.

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

【讨论】:

  • 嗨 Nicholas - 你的第二个子句缺少一个目标(:- true. 或者只是 . 而不是 :-)。
猜你喜欢
  • 1970-01-01
  • 2014-12-09
  • 2011-06-21
  • 2011-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多