【发布时间】:2020-08-13 01:53:24
【问题描述】:
有人能抽出一点时间帮助我理解为什么在 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
我不明白为什么它返回“真”,即使显然 6 不等于 10。我只是读错了跟踪吗?任何帮助,将不胜感激。 :)
【问题讨论】:
-
它递归地加 1 直到
n与 10 匹配,此时返回 true 以支持递归调用。尝试用大于 10 的值调用它,看看会发生什么。 -
所以基本上我读错了跟踪......如果我理解正确,它不会发送真正的递归调用,因为在每个递归调用它评估为真,这只是因为它确实在 n = 10 处评估为真,它表示整体为真?此外,使用大于 10 的数字调用它会使它像我预期的那样失控。我正在尝试理解递归,并制作了一个我知道会评估为 true 的非常简单的函数,以帮助理解正在发生的事情,而跟踪的输出让我失望了。
-
有点。调用在两种情况下返回 true:(1)
n = 10在自身内部或 (2) 如果n != 10,则使用n+1再次调用该函数并返回任何结果。如果某个子调用返回 true(即某个子调用中的n = 10),则父函数也将返回 true。 -
哎呀...我想我现在明白了。非常感谢您的宝贵时间。非常感谢。
标签: lisp