Lisp报错Undefined function B,隔层递归反转列表问题求助
Lisp递归反转列表报错修复
核心报错原因
你遇到的Undefined function B错误是因为Lisp的语法规则:括号内的第一个元素会被识别为函数调用对象,你在cond分支写的((b T) ...)会被解析为调用名为b的函数、传入参数T,而你实际是要判断变量b的布尔值,不需要把b和判断值都包在同一个括号里。
同时你的代码还有两处语法错误:
(revList (cdr L nil))括号位置错误,cdr仅接受1个参数,你是要给revList传入两个参数:取过cdr的列表、和布尔标记,正确写法为(revList (cdr L) nil)- cond分支不需要写两个判断b值的分支,用
t作为兜底分支即可。
修复后可运行代码
(defun revList (L b) (cond ((null L) nil) (b ; 布尔标记为真时执行反转逻辑 (append (revList (cdr L) nil) (list (car L)))) (t ; 布尔标记为假时执行对应逻辑,你可以根据需求调整这部分的实现 (append (revList (cdr L) t) (list (car L)))))) (print (revList '(1 (2 3) (4 (5 6)) (7 (8 (9 10)))) t))
逻辑优化提示
你当前的实现中布尔标记为真、假时执行的逻辑完全一致,没有实现“每隔一个递归层级才执行对应操作”的需求,如果需要仅奇数层级反转、偶数层级保持原序,可以调整假分支的逻辑:
(defun revList (L b) (cond ((null L) nil) (b (append (revList (cdr L) nil) (list (car L)))) (t (cons (car L) (revList (cdr L) t)))))
如果需要处理嵌套列表的层级反转,需要额外对每个元素(car L)做递归判断,再拼装到结果中。
内容的提问来源于stack exchange,提问作者Nick Reck
相关产品推荐
相关产品推荐

