3

我有一个具有以下属性的 Scheme 函数:它计算嵌套列表结构的叶节点数,忽略 #f。它使用递归过程:

  • 如果输入是一个空列表,则这是返回 0 的基本情况。
  • 如果输入是汽车不是列表的对:
    • 如果汽车是#f,我们在 cdr 上递归并返回它。
    • 否则,我们将 car 计为 1,并将其添加到 cdr 上的递归结果中。
  • 最后,我们对 car 和 cdr 进行递归,并将它们相加。

如何将以下代码转换为编程语言 Clojure?

(define (x lis)
  (cond ((null? lis) 0) 
        ((not (list? (car lis))) 
         (cond 
          ((eq? (car lis) #f) (x (cdr lis))) 
          (else (+ 1 (x (cdr lis)))))) 
        (else (+ (x (car lis)) (x (cdr lis))))))
4

1 回答 1

4

透明翻译是

(defn x [lis]
  (cond (empty? lis) 0
        (not (coll? (first lis)))
        (if (= (first lis) false)
          (x (rest lis))
          (inc (x (rest lis))))
        :else (+ (x (first lis)) (x (rest lis)))))

或者你问过clojure的具体解决方案吗?

已编辑(clojure 特定解决方案版本 1)。

(defn x [lis]  
  (count (filter (partial not= false) (flatten lis))))
于 2012-12-02T15:19:16.907 回答