【问题标题】:Common Lisp Function通用 Lisp 函数
【发布时间】:2011-11-04 20:11:58
【问题描述】:

我想创建一个函数来验证列表的数字是否介于 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...) 开始。但是,它不起作用,而且由于我的知识有限,我无法进行任何类型的更改。任何帮助或见解将不胜感激。 谢谢你。

【问题讨论】:

    标签: lisp common-lisp


    【解决方案1】:

    我认为你自己做的工作太多了。考虑更高的功能。您的问题陈述已经告诉了您一半:“检查每个数字是否在 1-10 范围内”。

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

    【讨论】:

      【解决方案2】:

      这个怎么样:

      (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))))))
      

      【讨论】:

      • 谢谢!!!你已经恢复了我的理智......我没想过使用 cond。我想如果我要循环通过它,更好的选择是 DO。非常感谢您的时间和精力。
      • 使用 LOOP 和 COLLECT(或 IF 和 COLLECT)也是一种选择。
      【解决方案3】:

      我认为您想对每个元素应用 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))))))))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-11-13
        • 2021-10-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-06
        • 1970-01-01
        相关资源
        最近更新 更多