如何在LISP递归函数中传递变量与列表替代常量值
解决LISP递归函数传递比较变量的问题
你写的代码核心问题在于递归调用时漏掉了传递阈值参数x——递归过程中必须把比较用的x一直传递下去,否则后续的递归调用不知道该用什么值来和列表元素做比较。
正确实现代码
(defun greaterthanX (x l) (if l (if (> (car l) x) (cons (car l) (greaterthanX x (cdr l))) ; 递归时必须传递x (greaterthanX x (cdr l)) ; 此处同样要传递x ) nil)) ; 列表为空时返回nil,明确递归终止条件 (print (greaterthanX 5 '(1 2 3 4 5 6 7 8 3)))
关键说明
- 函数参数调整为
(x l),第一个参数是自定义的比较阈值,第二个是待筛选的列表 - 所有递归调用必须同时传入
x和(cdr l),保证每一层递归都能拿到正确的比较基准 - 显式写出
nil作为空列表的返回值,让递归逻辑更清晰(LISP默认会返回nil,但显式声明可读性更强) - 调用时直接传数字
5即可,不需要加单引号——加引号会把它变成符号'5,和数字比较可能引发错误(部分LISP实现会自动转换,但直接传字面量更规范)
测试输出
运行代码后会得到预期结果:
(6 7 8)
内容的提问来源于stack exchange,提问作者nYuker_98 D
相关产品推荐
相关产品推荐

