寻找最大元素的迭代解决方案

时间:2014-11-08 08:24:25

标签: 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))))

2 个答案:

答案 0 :(得分:1)

我假设你的意思是“迭代”,如“使用内置的迭代结构”,而不是“使用常量堆栈空间”,因为Common Lisp并不普遍优化尾调用。像

这样的东西
(loop for elem in my-list maximizing elem)

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

答案 1 :(得分:1)

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

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