You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Lisp中移除嵌套列表中的所有数字(禁用loop/if/mapcan)

解决Lisp中REMOVE-NUM函数的嵌套列表递归问题

你的现有代码能处理顶层列表中的数字,但碰到嵌套列表时失效,核心问题是没有对嵌套的子列表递归执行REMOVE-NUM操作——原代码遇到非数字、非空的元素时,直接把元素原样拼接到结果里,完全没处理子列表内部的数字。

修正后的代码

(defun REMOVE-NUM (L)
  (cond
    ((null L) nil)
    ((numberp (car L)) (REMOVE-NUM (cdr L)))
    ((listp (car L)) (cons (REMOVE-NUM (car L)) (REMOVE-NUM (cdr L))))
    (t (cons (car L) (REMOVE-NUM (cdr L))))))

代码分支说明

  • 第一个分支:如果输入列表为空,直接返回空列表,作为递归的终止条件。
  • 第二个分支:如果当前列表的第一个元素是数字,跳过它,递归处理剩余的cdr部分。
  • 第三个分支:新增的关键分支——如果当前第一个元素是子列表,先递归处理这个子列表(移除其中的数字),再把处理后的子列表和cdr部分的处理结果拼接起来。
  • 第四个分支:如果元素既不是数字也不是列表,直接保留,拼接cdr的处理结果。

测试验证

输入:

(REMOVE-NUM '(2 A (3 B) C D))

输出:

(A (B) C D)

内容的提问来源于stack exchange,提问作者William Young

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 18:12:38