【发布时间】:2017-08-18 06:26:38
【问题描述】:
我正在研究一本书中的一个问题,其中我有一棵二叉树,我需要检查左右子树上所有原子的总和是否相等,如果不相等,则返回 nil。我设法在两个函数中做到这一点,但是当我尝试在一个函数中做到这一点时,我得到一个错误,因为它试图将一个数字添加到 nil。
代码是
(defun foo (list)
(cond ((null list) 0)
((atom list) list)
((/= (foo (cadr list))
(foo (caddr list))) nil)
( T (+ (foo (car list))
(foo (cdr list))))))
编辑:问题有两个。
1) 使用之前的结构,它会尝试评估 (cdr '(number)) 所以当它遇到一个看起来像 '(a (bc) d) 的列表时它会返回 null,因为它会尝试访问 (cdr '(d))
2) 我使用 /= 仅当两个参数都是数字时才有效
有效的代码:
(defun foo (list)
(cond ((null list) 0)
((atom list) list)
((null (cdr list)) (car list))
((null (equal(foo (cadr list)) (foo (caddr list)))) nil)
(T (+ (car list)
(foo (cadr list))
(foo (caddr list))))))
【问题讨论】:
-
你是怎么调用这个函数的?
-
您的规格不完整。就像现在写的那样,您可以通过
(defun foo (list) nil)来满足它。 -
由于只能加数字,所以在使用前需要检查FOO的结果。
-
@RainerJoswig 我认为问题不在于添加数字,我认为问题在于我的逻辑。理想情况下,它不应该添加 nil 和数字,因为它应该以 nil 退出,并且具有两个函数的实现可以工作,因为它下降到树的有限级别。
-
@melpomene 我认为你是对的,我似乎无法弄清楚如何让它工作或我应该添加什么。
标签: lisp