我想创建一个函数来验证列表的数字是否介于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 ...)开始。然而,它不起作用,我无法做任何类型的改变,主要是因为我的知识有限。任何帮助或见解将不胜感激。 谢谢。
答案 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))))))))