递归查找首个奇数:如何设置「未找到结果」的返回值?
递归查找列表中第一个奇数的函数优化
原函数及问题
原递归函数用于查找列表中第一个奇数,正常场景下返回正确结果,但遇到列表无奇数或输入非合法列表时会抛出错误:
(defun find-first-odd (x) (cond ((oddp (first x)) (first x)) (t (find-first-odd (rest x)))))
原测试用例
- 正常场景:
(find-first-odd '(2 2 10 3 4 6 4)) ; => 3 - 无奇数的列表:
(find-first-odd '(2 2 10 4 6 4)) ; => 错误:值nil不是整数 - 非合法列表(点列表):
(find-first-odd '(2 2 10 4 6 4 . 2)) ; => 错误:2不是列表类型
优化后的函数
我们需要在递归终止条件中加入空列表判断,同时处理输入非列表的情况,确保函数在无奇数时返回「未找到奇数」的提示:
(defun find-first-odd (x) (cond ((not (listp x)) "未找到奇数") ; 处理非列表输入 ((null x) "未找到奇数") ; 列表遍历完无奇数 ((oddp (first x)) (first x)) ; 找到第一个奇数,返回对应值 (t (find-first-odd (rest x))))) ; 递归遍历剩余元素
优化后测试用例
- 正常场景:
(find-first-odd '(2 2 10 3 4 6 4)) ; => 3 - 无奇数的列表:
(find-first-odd '(2 2 10 4 6 4)) ; => "未找到奇数" - 非合法列表(点列表):
(find-first-odd '(2 2 10 4 6 4 . 2)) ; => "未找到奇数"
优化说明
- 新增
(not (listp x))判断:当输入不是合法列表时,直接返回提示信息 - 新增
(null x)判断:当列表遍历至空(所有元素都不是奇数)时,返回提示信息 - 保留原有奇数判断与递归逻辑,确保正常场景下的功能不受影响
内容的提问来源于stack exchange,提问作者Vinn
相关产品推荐
相关产品推荐

