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

Common Lisp新手求助:定义递归函数shorten删除列表末尾n个元素

解决Common Lisp递归函数shorten的实现问题

要实现递归函数shorten删除列表最后n个元素,可以利用双指针递归思路避免重复计算列表长度,提升效率:

(defun shorten (n lst)
  (cond
    ((<= n 0) lst)                ; 当n≤0时,无需删除元素,直接返回原列表
    ((null (nthcdr n lst)) nil)    ; 若列表长度≤n,返回空列表
    (t (cons (car lst) (shorten n (cdr lst)))))) ; 否则保留当前元素,递归处理剩余列表

逻辑解释

  1. 终止条件1:当n小于等于0时,不需要删除任何元素,直接返回原列表。
  2. 终止条件2:用nthcdr n lst获取列表跳过前n个元素后的剩余部分,如果这部分为空,说明原列表长度不超过n,此时返回空列表。
  3. 递归步骤:如果列表长度大于n,就保留当前列表的第一个元素,然后递归处理列表的剩余部分(cdr lst),最终将所有保留的元素拼接起来。

示例测试

调用(shorten 5 '(1 2 3 4 5 6 7 8 9)),会逐步递归处理:

  • 每次递归都检查剩余列表长度是否大于5,直到处理到(5 6 7 8 9)时,nthcdr 5结果为空,返回nil;
  • 向上回溯拼接保留的元素,最终得到(1 2 3 4),符合预期。

边界情况验证

  • (shorten 0 '(1 2 3)) → (1 2 3)(n=0不删除)
  • (shorten 3 '(1 2 3)) → nil(n等于列表长度,删除全部)
  • (shorten 10 '(1 2 3)) → nil(n大于列表长度,返回空)
  • (shorten -2 '(1 2 3)) → (1 2 3)(n为负数,返回原列表)

内容的提问来源于stack exchange,提问作者CL-Beginner Zoni

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 10:55:17