如何解决Lisp中的递归跟踪...可以使用一些建议
有人可以抽出一点时间来帮助我理解为什么在Lisp的这个小功能中,这种评估一直保持为真吗?
(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,我也不明白为什么它返回“ true”?我只是读错了迹线吗?任何帮助,将不胜感激。 :)
解决方法
如评论中所述,递归具有两个组成部分:基本情况(不进行递归调用的条件)和递归情况。跳过基本情况的递归函数可以通过递归情况返回一个值。
在您的示例中,每个呼叫向n
加1将得出n = 10
的基本情况(假设n
始于<= 10
-如果它始于{ {1}}您将拥有无限递归,因为基本情况无法实现。当呼叫确实达到> 10
时,基本情况将返回true,并将其一直传递到备份堆栈中。对于您的函数,只有两种可能的结果:无限递归或返回true。
这说明了为什么所有功能对于n = 10
都返回true;尽管直到n = 5
时它们的基本情况才成立,但子调用的结果是。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。