3

次の属性を持つ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))))))
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固有のソリューションver.1)。

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