【发布时间】:2017-01-07 09:37:46
【问题描述】:
我正在学习将问题转换为 Clojure 的 SICP,以学习 Clojure 和阅读 SICP。目前,我坚持使用第 2.2.2 节中的 Count Leaves 程序。
目标是编写一个函数,该函数采用树的列表表示,例如'(1 2 '(3 4)) 并计算叶子的数量,在本例中为 4。
到目前为止,我想出的最接近的是
(defn count-leaves
[coll]
(cond
(nil? coll) 0
(not (seq? coll)) 1
:else (let [[left & right] coll] (+ (count-leaves left) (count-leaves right)))
))
但是,这不能正确处理子树。特别是,它评估
(count-leaves '('(1)))
改为 2 而不是 1。
注意 Scheme 实现 from the book 是:
(define (count-leaves x)
(cond ((null? x) 0)
((not (pair? x)) 1)
(else (+ (count-leaves (car x))
(count-leaves (cdr x))))))
【问题讨论】:
-
"...将
(count-leaves '('(1)))评估为 2..." - 应该如此。'('(1))的计算结果为((quote (1)))。不要在已经引用的列表中引用子列表。 -
谢谢,我以为'('(1)) 和(list (list 1)) 一样,但显然我错了。更多信息:stackoverflow.com/questions/38515614/…