recursion - Lisp递归函数检查列表中的值不起作用
问题描述
我正在研究一个递归函数,它接受一个列表和一个值 ex:'b'(a.b),如果没有找到则返回 nil,如果找到则返回 t。我的问题出在 (cond ((eq A (car L))) t) 行中,即使在 (cond ((and (and (atom L (eq AL))) t) 返回之后,它似乎也在检查该条件。我在印象是,如果满足该条件,则执行停止并且函数返回。有什么办法可以解决这个问题?另外,我只能使用原始函数 defun cond cons car cdr 运算符 +、-、< 和 > null eq listp atom symbolp
;test cases
(checkInner 'b '(a . b))
(checkInner 'f '(c e f))
(checkInner 'b '(b))
;function
(defun checkInner(A L)
(cond ((and (atom L) (eq A L)) t)
)
(cond ((or (atom L) (eq A L)) nil)
)
(cond ((eq A (car L)) t)
(t (checkInner A (cdr L))
)
)
)
解决方案
除非您使用显式(return-from checkInner value)
表达式,否则函数将返回其最后一个表达式的值。因此,您的函数返回的唯一值是最后一个cond
表达式;前两个测试被忽略。
您需要将所有案例组合成一个COND
表达式。
另外,第二个测试不应该使用or
. ifL
是一个原子,它不等于,L
因为我们在前面的例子中测试过。
(defun checkInner(A L)
(cond ((and (atom L) (eq A L)) t)
((atom L) nil)
((eq A (car L)) t)
(t (checkInner A (cdr L)))))
推荐阅读
- android - 为什么在可绘制文件的图层列表中添加图像作为项目会导致图像不缩放/丢失
- caching - 使用 apollo angular 调用 readQuery 后的“不变违规”
- python - ChromeDriver ERR_SSL_PROTOCOL_ERROR 尽管 --ignore-certificate-errors
- java - 无法为实现 Spring Security UserDetails 的类加载请求的类异常
- jax-rs - 自定义 ConstraintValidatior 在 JAX-RS 中执行两次
- python - TypeError:scipy.sparse 矩阵乘法当前不支持对象数组
- c# - 如何设计具有生成 ID 的模型
- python - 使用 python defaultdict 创建嵌套的 json
- matlab - MATLAB 的堆栈大小是多少?
- ruby-on-rails - 将列添加到模型时出现rails语法错误