Common Lisp函数

时间:2011-11-04 20:11:59

标签: lisp common-lisp

我想创建一个函数来验证列表的数字是否介于1到10之间(包括1和10)。如果他们这样做,我想将它添加到我创建的新列表中。但是,如果它们未能落在范围内,我决定将它们转换为适合而不是丢弃它们(通过添加(1+(随机10))。

(defun fit (lst)

  "(lst) check every number if it fits the range (1-10)"

  (do ((fit lst (cdr fit))

       (range nil))
      ((null fit) (reverse range))
    (if (and (>= fit 1) (=< fit 10))
        (seft ((cons fit range))))
       (or (< fit 1) (> fit 10)) 
           (cons (+ fit (1+ (random 10))) range)))

代码从(defun fit ...)开始。然而,它不起作用,我无法做任何类型的改变,主要是因为我的知识有限。任何帮助或见解将不胜感激。 谢谢。

3 个答案:

答案 0 :(得分:2)

我认为你自己想做太多的工作。想想更高的功能。你的问题陈述已经告诉你一半:“如果它符合1-10的范围,请检查每个号码。”

如何使用(每个)?然后你需要传递一个检查单个数字的函数。可能是lambda ......

答案 1 :(得分:1)

这个怎么样:

(defun fit (list)
  (cond ((null list) '())
        ((< (car list) 1)
         (fit (cons (+ (car list) (random 10)) (cdr list))))
        ((> (car list) 10)
         (fit (cons (- (car list) (random 10)) (cdr list))))
        (t (cons (car list) (fit (cdr list))))))

答案 2 :(得分:0)

我认为你想对每个元素应用make-fitting函数。

(defun make-fitting (n)
  (loop (incf n
              (cond ((> n 10) (- (1+ (random 10))))
                    ((< n 1) (1+ (random 10)))
                    (t (return-from make-fitting n))))))

(defun fit (list)
  (mapcar #'make-fitting list))

如果您预计会有不同的限制,则应将它们作为可选参数提供:

(defun make-fitting (n &optional (low 1) (high 10))
  (let ((step-size (1+ (- high low))))
    (flet ((random-step (size)
             (1+ (random size))))
      (loop (incf n
                  (cond ((> n high) (- (random-step step-size)))
                        ((< n low) (random-step step-size))
                        (t (return-from make-fitting n))))))))