2013-07-08 2 views
3

나는 Clojure를 배우고있다. 기본적인 기본 작업은 피보나치 시퀀스를 생성하는 것입니다. 나는 (응, 반전 및 목록) 명령형 솔루션의 거의 사본을 끝낼 :Clojure의 피보나치 수

(defn n-fib [n] 
    (if (= n 1) '(1) 
    (loop [i 2 l '(1 1)] 
    (if (= i n) 
     l 
     (recur (inc i) (cons (+ (fst l) (snd l)) l)))))) 

더 좋은 방법은, 더 많은 기능, 간결 무엇입니까? 게으른 시퀀스? 어떻게 사용합니까? (... 게으름) 하스켈 솔루션은 무한 순서를 제공

fib = 1 : 1 : zipWith + (tail fib) 

참고 : 예를 들어, 하스켈에서 내가 한 라이너를 쓸 수 게으름을 사용. Clojure가 열망하고 게으른 솔루션이 될 수 있다면 (심지어 길이가 긴리스트를 얻는 것조차도) 나는 둘 다 알고 싶다.

업데이트 : 수율이 목록을 환입 할 수 없습니다 만, 그것을 생성하기 위해 스택을 사용있어 또 다른 방법 :

(defn n-fib [n] 
    (defn gen [i a b] 
    (if (= i 0) 
     () 
     (cons (+ a b) (gen (dec i) b (+ a b))))) 
    (gen n 0 1)) 
+1

목록 대신 벡터 표현을 사용할 수 있습니다. 생성기가있는 마지막 솔루션 인 경우 스택 사용을 피하기 위해 스트림 단점을 사용할 수 있어야합니다. 스트림은 첫 번째 항이 값이고 두 번째 항이 나머지 값을 계산하기위한 지연된 표현입니다. – WorBlux

+1

Clojure에서'def' /'defn'은 함수 내에서 사용해서는 안됩니다. 특히 그렇게하면 글로벌 바가 만들어지며 지역민이 만들어지지는 않습니다. 지역 주민을 소개하려면'let' 또는'letfn'을 사용하십시오. –

+1

이것은 무한 스트림 (= stream lazy-seq) 섹션의 유명한 SICP 서적의 첫 번째 예제 중 하나입니다. 기본적인 게으른 seq 개념을 이해하기위한 강력하게 권장되는 읽기 http://mitpress.mit.edu/sicp/full-text/book/book-ZH-24.html#%_sec_3.5.2 –

답변

7

당신은 http://en.wikibooks.org/wiki/Clojure_Programming/Examples/Lazy_Fibonacci

에 당신의 게으른 하스켈 솔루션 등가를 볼 수도 있습니다이입니다

(def fib (lazy-cat [1 1] (map + (rest fib) fib))) 
+0

http : // clojuredocs에서 꽤 많이 발견되었습니다. .org/clojure_core/clojure.core/iterate 및 http://clojuredocs.org/clojure_core/clojure.core/lazy-seq를 참조하십시오. 둘 다 샘플로 피보나치 seq를 가지고 있습니다. – demi