我有一个问题需要你的帮助。
编写名为
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))))))
感谢您的帮助。
答案 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
,在您知道它是否应该是结果的一部分之前。
你应该怎么做:
有了这个逻辑..
(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)