关于这个 "flatten the nested list" 问题,这本书 answer-sheet 是不是错了?
Is the book's answer-sheet wrong about this "flatten the nested list" problem?
我正在尝试通过 Common Lisp:对符号计算的简单介绍 来学习 Common Lisp。此外,我正在使用 SBCL、Emacs 和 Slime。
在第8章中,作者提出了递归的概念。更具体地说,他展示了 cad/cdr 树上的递归。关于这个主题的练习之一是如何扁平化嵌套列表:
奇怪的是 answer-sheet 中出现的正确答案是:
本书的 answer-sheet 解决方案 在我的环境下 没有使用问题中提供的示例生成预期结果。
(defun flatten-book (tree)
(cond ((atom tree) (list tree))
(t (append (flatten-book (car tree))
(flatten-book (cdr tree))))))
全是NIL
,不应该。因此,我开始了我的 REPL:
CL-USER> (flatten-book '((A B (R)) A C (A D ((A (B)) R) A)))
(A B R NIL NIL A C A D A B NIL NIL R NIL A NIL NIL)
为了获得预期的结果,我需要更改插入 null clause
的方法:
(defun my-flatten (tree)
(cond ((null tree) nil)
((atom tree) (list tree))
(t (append (my-flatten (car tree))
(my-flatten (cdr tree))))))
本returns正确答案:
CL-USER> (my-flatten '((A B (R)) A C (A D ((A (B)) R) A)))
(A B R A C A D A B R A)
到目前为止,我非常喜欢这本书。而且它似乎是Common Lispers中的经典。
这是本书answer-sheet中的错误吗?我错过了什么?也许是历史性的改变?也许与不同的编译器有关?
书错了。
然而,通过这个小改动,书中的答案再次起作用:
(defun flatten (tree)
(cond ((null tree) tree) ;; this case was forgotten by the book!
((atom tree) (list tree))
(t (append (flatten (car tree))
(flatten (cdr tree))))))
我正在尝试通过 Common Lisp:对符号计算的简单介绍 来学习 Common Lisp。此外,我正在使用 SBCL、Emacs 和 Slime。
在第8章中,作者提出了递归的概念。更具体地说,他展示了 cad/cdr 树上的递归。关于这个主题的练习之一是如何扁平化嵌套列表:
奇怪的是 answer-sheet 中出现的正确答案是:
本书的 answer-sheet 解决方案 在我的环境下 没有使用问题中提供的示例生成预期结果。
(defun flatten-book (tree)
(cond ((atom tree) (list tree))
(t (append (flatten-book (car tree))
(flatten-book (cdr tree))))))
全是NIL
,不应该。因此,我开始了我的 REPL:
CL-USER> (flatten-book '((A B (R)) A C (A D ((A (B)) R) A)))
(A B R NIL NIL A C A D A B NIL NIL R NIL A NIL NIL)
为了获得预期的结果,我需要更改插入 null clause
的方法:
(defun my-flatten (tree)
(cond ((null tree) nil)
((atom tree) (list tree))
(t (append (my-flatten (car tree))
(my-flatten (cdr tree))))))
本returns正确答案:
CL-USER> (my-flatten '((A B (R)) A C (A D ((A (B)) R) A)))
(A B R A C A D A B R A)
到目前为止,我非常喜欢这本书。而且它似乎是Common Lispers中的经典。
这是本书answer-sheet中的错误吗?我错过了什么?也许是历史性的改变?也许与不同的编译器有关?
书错了。
然而,通过这个小改动,书中的答案再次起作用:
(defun flatten (tree)
(cond ((null tree) tree) ;; this case was forgotten by the book!
((atom tree) (list tree))
(t (append (flatten (car tree))
(flatten (cdr tree))))))