Recursion 递归的逐步帮助
我的老师问我,我已经看过很多在线文本教程,试图通过提问来获得更全面的递归知识,但是我仍然在努力理解如何实现它。我理解这个定义,因为它涉及到函数本身的调用,以及它被用来以更高效、更紧凑的方式编写某些代码部分的事实 我尤其难以理解递归是如何工作的,以及如何实现它来遍历列表中的项。对于给定给我们的问题集,我们需要使用递归来遍历并查找列表中的特定项。让我感到困惑的部分是列表的[H | T]部分,以及如何列出符合条件的项目并将其列在新列表中 有人能给我举一个小例子,每个步骤都解释了,我可以作为一个向导,尝试独立地解决我的问题集。这真的很有帮助,因为通过提前阅读,我对Prolog是新手,我知道这是一项至关重要的技能,我需要掌握才能更有效地使用该语言Recursion 递归的逐步帮助,recursion,prolog,Recursion,Prolog,我的老师问我,我已经看过很多在线文本教程,试图通过提问来获得更全面的递归知识,但是我仍然在努力理解如何实现它。我理解这个定义,因为它涉及到函数本身的调用,以及它被用来以更高效、更紧凑的方式编写某些代码部分的事实 我尤其难以理解递归是如何工作的,以及如何实现它来遍历列表中的项。对于给定给我们的问题集,我们需要使用递归来遍历并查找列表中的特定项。让我感到困惑的部分是列表的[H | T]部分,以及如何列出符合条件的项目并将其列在新列表中 有人能给我举一个小例子,每个步骤都解释了,我可以作为一个向导,尝
您的帮助会很好。Prolog中的列表是一个非常简单的数据结构:
- 一个空列表是prolog atom
[]
- 非空列表是序言术语
,其中(H,T)
是列表开头的列表项,并且H
- “T”是列表的尾部,这是另一个序言列表
[a,b,c]
)只是上述数据结构上的一种静态符号
是空列表[]
完全等同于[a]
(a,[])
完全等同于[a,b]
(a,.(b,[])
完全等同于[a,b,c]
(a,.(b,([]))
- 以此类推(我们可以很容易地看出为什么人们更喜欢方括号表示法而不是
表示法)/2
|
只是更具语法意义:
完全等同于[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.或just.而不是:-)。我所看到的最好的解释是:子句和效果:工作程序员的Prolog编程一书