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

LISP二维数组最大元素位置查询:返回结果不符合预期

问题分析与修复

你的代码存在两个核心问题:

  1. 列索引未重置:列计数器l在遍历完每一行后没有归零,导致它会累计所有行的元素总数,最终得到跨行列的累加值。
  2. 索引起始值错误:行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:35:20