Clojure方案

Clojure方案,clojure,scheme,Clojure,Scheme,我有一个Scheme函数,它具有以下属性: 它计算嵌套列表结构中的叶节点数,忽略#f。它使用递归过程: 如果输入为空列表,则这是返回0的基本情况 如果输入是一对车辆不是列表的车辆: 如果汽车是#f,我们在cdr上递归并返回它 否则,我们将汽车计数为1,并将其添加到cdr上的递归结果中 最后,我们在car和cdr上递归,并将它们添加到一起 如何将以下代码转换为编程语言Clojure (define (x lis) (cond ((null? lis) 0) ((not

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

  • 如果输入为空列表,则这是返回0的基本情况
  • 如果输入是一对车辆不是列表的车辆:
    • 如果汽车是#f,我们在cdr上递归并返回它
    • 否则,我们将汽车计数为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))))))

透明的翻译是

(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))))

如果将列表展平,clojure版本可能会产生意外结果。如果#f(或者代码中的false)在列表中,并且不一定在列表的前面(就像OP希望的那样),那么它将返回不正确的结果。如果可以的话,为了将来的观众,请添加一个包含一些映射函数的递归解决方案。请举例说明嵌套列表结构的问题。