列表中列出数字的功能

时间:2017-04-23 13:43:25

标签: list lisp common-lisp

我有一个问题需要你的帮助。

  

编写名为 list-number 的递归函数列出列表中的每个数字。例如,(list-number '(2 a 4 b)) => (2 4)

这是我的尝试。但它不起作用。你能帮我解决一下吗?

     (defun list-number (x)
       (cond ((numberp x) x)
             ((atom x) nil)
             (t (cons (list-number (car x)) (list-number (cdr x))))))

感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

你这样做:

(list-number '(2 a))                           ; ==
(list-number '(2 . (a . ())))                  ; == 
(cons (list-number '2) (list-number '(a . ())) ; ==
(cons (list-number '2)           ; 2 is a number
      (cons (list-number 'a)     ; a is an atom
            (list-number '())))  ; () is an atom ==
(cons 2 (cons nil nil))
; ==> (2 nil)

您的问题是cons ,在您知道它是否应该是结果的一部分之前

你应该怎么做:

  1. 检查是否为空列表,然后结果为空列表
  2. 检查第一个元素是否为数字。然后你将这个数字用于列表其余部分的递归。
  3. 如果两个都没有击中那么第一个元素不应该是结果的一部分。只是递归到列表的其余部分,因为它也可能有数字。
  4. 有了这个逻辑..

    (list-number '(2 . (a . ())))     ; == 
    (cons '2 (list-number '(a . ()))) ; ==
    (cons '2 (list-number '()))       ; ==
    (cons '2 '()) ; ==> (2)
    

    此逻辑不处理树。

答案 1 :(得分:0)

你是说这个?

(defvar *test '(2 a 4 b))

(defun list-number (nl)
  (cond ((numberp (car nl))
         (cons (car nl) (list-number (cdr nl))))
        ((eql nil nl)
         nil)
        (t
         (list-number (cdr nl)))))

(list-number *test)
(2 4)
顺便说一句,如果你想写一个尾递归函数,我建议在参数中存储雕像,如:

(defvar *test '(2 a 4 b))
(defun list-number (head nl)
  (cond ((eql nil nl)
         head)
        ((numberp (car nl))
         (list-number (append head (list (car nl))) (cdr nl)))
        (t
         (list-number head (cdr nl)))))

(list-number '() *test)
(2 4)