首页 文章

Common Lisp函数

提问于
浏览
2

我想创建一个函数来验证列表的数字是否介于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 回答

  • 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))))))
    
  • 0

    我想你自己想做太多的工作 . 想想更高的功能 . 您的问题陈述已经告诉您一半:“如果它适合1-10范围,请检查 every 数字” .

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

  • 2

    我认为你想在每个元素上应用 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))))))))
    

相关问题