Lisp函数修改需求:保留以指定字母结尾的单词
解决Lisp函数保留指定字母结尾单词的问题
看起来你卡在了如何正确获取单词的最后一个字符上,咱们一步步来修正这个问题:
先分析你当前代码的错误
你第5行的(char (string (length (car liste))) 0)逻辑完全走偏了:
(length (car liste))得到的是单词的长度数值(比如have的长度是4)- 把这个数值转成字符串会得到
"4",取第0个字符就是#\4,这显然不是你要的单词最后一个字符
正确获取最后一个字符的方法
要拿到单词的最后一个字符,得这么做:
- 把列表的当前元素转成字符串:
(string (car liste)) - 用
length获取这个字符串的长度,然后减1得到最后一个字符的索引(因为Lisp字符串索引从0开始) - 用
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
相关产品推荐
相关产品推荐

