以下递归函数的非递归函数是什么?

时间:2014-02-15 04:05:31

标签: recursion lisp

(defun filter-numbers-rec (inlist)
  "This function filters out non-numbers from its input list and returns
the result, a list of numbers"
  (cond
    ((not (listp inlist))
     (princ "Argument must be a list")
     (terpri)
     ())
    ((null inlist)
     ())
    ((not (numberp (car inlist)))
     (filter-numbers-rec (cdr inlist)))
    (t
     (cons (car inlist)
           (filter-numbers-rec (cdr inlist))))))

1 个答案:

答案 0 :(得分:3)

好吧,该函数的功能描述就是你要删除列表中的每个东西如果不是 a数字,所以这里一个好的候选人是remove-if-not,您将使用如下:

(remove-if-not 'numberp '(1 a 2 b 3 c #\x (y 4)))
;=> (1 2 3)

如果由于某种原因,你想以(可能)不使用递归的方式编写它,你可以使用do

(do ((list '(1 a 2 b 3 c #\x (y 4)) (rest list))
     (result '()))
    ((endp list) (nreverse result))
  (when (numberp (car list))
    (push (car list) result)))
;=> (1 2 3)

如果您不喜欢do的冗长,可以使用loop

(loop :for x :in '(1 a 2 b 3 c #\x (y 4))
   :when (numberp x)
   :collect x)
;=> (1 2 3)