Lisp 求最大元的迭代解法

Lisp 求最大元的迭代解法,lisp,common-lisp,Lisp,Common Lisp,我需要通过迭代求解最大代码。我是从创建数组开始的,您能帮我继续吗: (do do-array (d l) (setf b (make-array (length d)) (do (((i=0)(temp d)) ((> i (- l 1)) (return)) (setf (aref b i) (car temp)) (setq i (+ i 1)) (setq temp (cdr temp)))) 我假设您的意思是“使用内置迭代构造”中的“迭代”,而不是“

我需要通过迭代求解最大代码。我是从创建数组开始的,您能帮我继续吗:

(do do-array (d l) 
  (setf b (make-array (length d)) 
  (do (((i=0)(temp d)) ((> i (- l 1)) (return)) 
  (setf (aref b i) (car temp)) 
  (setq i (+ i 1)) 
  (setq temp (cdr temp))))
我假设您的意思是“使用内置迭代构造”中的“迭代”,而不是“使用常量堆栈空间”,因为Common Lisp并不普遍优化尾部调用。差不多

(loop for elem in my-list maximizing elem)

我应该为你做这件事。问题中重要但未指明的部分是:如何处理空列表?上面返回的是
0
,但您可能希望返回
nil
或抛出错误?

作为基于
循环的解决方案的替代方案,这里有一些更详细的内容:

CL-USER> (defun my-max (lst)
           (let ((max (car lst)))
             (dolist (x (cdr lst) max)
               (when (> x max)
                 (setf max x)))))
MY-MAX
CL-USER> (my-max '())
NIL
CL-USER> (my-max '(1 2 3 -4))
3

哪种方言?Emacs Lisp,Common Lisp?另外,您需要使用向量还是可以使用列表?具体点。我和Common lisp需要使用list@PatyRizk你问题中的代码(aref,make array)表明你想要一个数组,但在前面的评论中你说你想要一个列表。然后在一个好的答案中,你说你需要使用一个数组。请澄清您的问题(使用问题下方的编辑链接)。现在我们不知道你在要求什么;;我需要先写一个数组,然后写一个函数来打印数组示例(5 4 7 1 9 3),然后在一个函数之后找到这个数组中的最大值什么是
(i=0)
?CL不使用
=
分配任务。我会写
(dolist(x(cdrlst)max)…
dolist
的第一个参数中的第三个元素是返回值形式。此外,由于
max
也必须进行比较,因此最好只使用
(setf max(max max max x))
。实际上,使用这两个元素,并将max作为辅助变量,您可以得到:
(defun my max(list&aux(first list))(dolist(x))(rest list)max)(setf max(max x max)))
@JoshuaTaylor,关于
dolist
的返回值,你是对的。然而,
max
只是一个变量的名称,只有一个比较。是的,对不起,我把它误读为
(when(>x max)(setf x(max))
;我不知道为什么