LISP二维数组最大元素位置查询:返回结果不符合预期
问题分析与修复
你的代码存在两个核心问题:
- 列索引未重置:列计数器
l在遍历完每一行后没有归零,导致它会累计所有行的元素总数,最终得到跨行列的累加值。 - 索引起始值错误:行
k和列l初始设为1,导致返回的索引从1开始,不符合你需要的0起始坐标规则。
修复后的代码(基于原逻辑调整)
(defun find-max-location (x) (let ((maxval -100) (cur 0) (cur2 0) (k 0) ; 行索引从0开始 (l 0)) ; 列索引从0开始 (loop for row in x do (loop for element in row do (when (> element maxval) (setf cur k) (setf cur2 l) (setf maxval element)) (incf l)) ; 处理完元素后列索引+1 (incf k) (setf l 0)) ; 每行结束后重置列索引为0 (list cur cur2))) (find-max-location '((0 1 0 0 1) (0 2 2 0 0) (3 0 1 4 7) (0 1 2 0 0) (1 2 1 0 3))) ; 执行结果:(2 4),符合预期
更简洁的Lisp风格写法
利用loop的and语法直接跟踪索引,避免手动维护计数器,代码更清晰:
(defun find-max-location (x) (let ((max-val -100) (max-row 0) (max-col 0)) (loop for row in x and row-index from 0 do (loop for element in row and col-index from 0 do (when (> element max-val) (setf max-val element) (setf max-row row-index) (setf max-col col-index)))) (list max-row max-col)))
关键修改点说明
- 将行、列索引的初始值从1改为0,匹配目标的0起始坐标规则。
- 在每行遍历结束后,强制将列索引重置为0,确保下一行的列计数从0重新开始。
- 用
incf替代(setf var (+ var 1)),这是Lisp中更惯用的增量写法。
内容的提问来源于stack exchange,提问作者anthonyvn
相关产品推荐
相关产品推荐

