【问题标题】:How write one Function that find out all odd number in Common lisp?如何编写一个在 Common lisp 中找出所有奇数的函数?
【发布时间】:2016-03-02 02:35:09
【问题描述】:

这是我的函数,它从列表中返回所有奇数:

(defun check-all-oddp (n)
   (cond ((null n) nil)
         ((oddp (first n))
           (cons (first n)
                 (check-all-oddp (rest n))))
         (t (check-all-oddp (rest n)))))

那是我用递归写的。如何在不递归的情况下使用do 重写它?

【问题讨论】:

  • 是的,这是 Touretzky 书中的练习 11.9。您尝试解决什么问题?您的实际问题是什么?

标签: recursion iteration common-lisp


【解决方案1】:

一种方法是在do 中累积一个列表,方法是在其前面仅添加奇数,然后在末尾反转该列表:

(defun odds-of (numbers)
  (do ((x numbers (cdr x))
       (odds '() (if (oddp (car x)) (cons (car x) odds) odds)))
      ((null x) 
       (nreverse odds))))

我们先加然后反转而不是追加的原因是因为前置是O(1),而反转是O(n),而追加是O(n) 所以重复追加会导致二次时间复杂度。

【讨论】:

    【解决方案2】:

    为什么不只使用 remove-if-not 等高阶函数?

    (defun odds-of (numbers)
        (remove-if-not #'oddp numbers))
    
    (odds-of (loop for x below 10 collect x)) => '(1 3 5 7 9)
    

    lisp 社区鼓励使用(和重用)高阶函数,而关于过滤的函数通常用于 remove-if-notremove-if。检查酷的材料:Filter Function

    【讨论】:

      猜你喜欢
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 2014-04-26
      • 2019-01-18
      相关资源
      最近更新 更多