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

Lisp函数修改需求:保留以指定字母结尾的单词

解决Lisp函数保留指定字母结尾单词的问题

看起来你卡在了如何正确获取单词的最后一个字符上,咱们一步步来修正这个问题:

先分析你当前代码的错误

你第5行的(char (string (length (car liste))) 0)逻辑完全走偏了:

  • (length (car liste))得到的是单词的长度数值(比如have的长度是4)
  • 把这个数值转成字符串会得到"4",取第0个字符就是#\4,这显然不是你要的单词最后一个字符

正确获取最后一个字符的方法

要拿到单词的最后一个字符,得这么做:

  1. 把列表的当前元素转成字符串:(string (car liste))
  2. 用length获取这个字符串的长度,然后减1得到最后一个字符的索引(因为Lisp字符串索引从0开始)
  3. 用char函数取出这个索引对应的字符

修改后的完整函数

(defun endingwith (x liste)
  (cond
    ((not liste) nil)  ; 列表为空时返回nil
    ((equal (char (string (car liste)) (- (length (string (car liste))) 1))
            (char (string x) 0))  ; 比较当前单词的最后一个字符和指定字符
     (rplacd liste (endingwith x (cdr liste)))  ; 保留当前元素,递归处理剩余列表并修改原列表的cdr
     liste)  ; 返回修改后的当前列表节点
    (t (endingwith x (cdr liste)))))  ; 不满足条件,直接递归处理剩余列表

测试验证

用你给出的测试列表:

(setq liste '(have read nose art silence))
(endingwith 'e liste)  ; 会返回(have nose silence)

额外说明

  • 这里用rplacd是直接修改原列表的结构,所以调用函数后原列表liste也会被修改(变成(have nose silence)),如果需要保留原列表,你可能需要先复制一份再传入,但根据你的要求必须用rplacd,所以这个实现符合要求
  • 我们严格遵循了你的限制:只使用了char、rplacd、length函数,没有引入其他工具函数

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 14:57:30