lisp 中的递归跟踪...可以使用一些建议
Recursion tracing in lisp... could use some advice
有人能抽出一点时间来帮助我理解为什么在 Lisp 中的这个小函数中它一直评估为 true 吗?
(defun fob (n)
(if (= n 10)
'true
(fob (+ n 1))))
继续评估追踪到:
0: (FOB 5)
1: (FOB 6)
2: (FOB 7)
3: (FOB 8)
4: (FOB 9)
5: (FOB 10)
5: FOB returned TRUE
4: FOB returned TRUE
3: FOB returned TRUE
2: FOB returned TRUE
1: FOB returned TRUE
0: FOB returned TRUE
我不明白为什么它返回 'true',尽管显然 6 不等于 10。我只是读错了轨迹吗?任何帮助,将不胜感激。 :)
正如评论中所讨论的,递归有两个组成部分:一个基本情况(没有进行递归调用的条件)和一个递归情况。基本情况被跳过的递归函数可以 return 通过递归情况的值。
在您的示例中,每次调用向 n
加 1 将达到 n = 10
的基本情况(假设 n
开始于 <= 10
——如果它开始out > 10
你将有无限递归,因为基本情况是不可到达的)。当调用确实到达 n = 10
时,基本情况将 return 为真,它一直传递到调用堆栈。对于您的函数,只有两种可能的结果:无限递归或 returning true.
这解释了为什么您的所有函数 return 对于 n = 5
都是正确的;虽然他们的基本情况直到 n = 10
才成立,但子调用的结果是。
有人能抽出一点时间来帮助我理解为什么在 Lisp 中的这个小函数中它一直评估为 true 吗?
(defun fob (n)
(if (= n 10)
'true
(fob (+ n 1))))
继续评估追踪到:
0: (FOB 5)
1: (FOB 6)
2: (FOB 7)
3: (FOB 8)
4: (FOB 9)
5: (FOB 10)
5: FOB returned TRUE
4: FOB returned TRUE
3: FOB returned TRUE
2: FOB returned TRUE
1: FOB returned TRUE
0: FOB returned TRUE
我不明白为什么它返回 'true',尽管显然 6 不等于 10。我只是读错了轨迹吗?任何帮助,将不胜感激。 :)
正如评论中所讨论的,递归有两个组成部分:一个基本情况(没有进行递归调用的条件)和一个递归情况。基本情况被跳过的递归函数可以 return 通过递归情况的值。
在您的示例中,每次调用向 n
加 1 将达到 n = 10
的基本情况(假设 n
开始于 <= 10
——如果它开始out > 10
你将有无限递归,因为基本情况是不可到达的)。当调用确实到达 n = 10
时,基本情况将 return 为真,它一直传递到调用堆栈。对于您的函数,只有两种可能的结果:无限递归或 returning true.
这解释了为什么您的所有函数 return 对于 n = 5
都是正确的;虽然他们的基本情况直到 n = 10
才成立,但子调用的结果是。