2014-10-08 12 views
6

की पूंछ कैसे प्राप्त करने के लिए मैं यहाँ एक ही रास्ता है कि कैसे मैं की तरहअनुक्रम clojure

((1 2 3 4) (2 3 4) (3 4) (4)()) 

उत्तर

13

एक और तरीका है सब पूंछ पाने के लिए reductions समारोह का उपयोग करके।

user=> (def x '(1 2 3 4)) 
#'user/x 
user=> (reductions (fn [s _] (rest s)) x x) 
((1 2 3 4) (2 3 4) (3 4) (4)()) 
user=> 
1

अनुक्रम के सभी पूंछ प्राप्त कर सकते हैं theem

(1 2 3 4) 

की clojure में अनुक्रम है।

user=> (def x [1 2 3 4]) 
#'user/x 
user=> (map #(drop % x) (range (inc (count x)))) 
((1 2 3 4) (2 3 4) (3 4) (4)()) 
+2

यह आलसी अनुक्रमों पर उपयोग नहीं किया जाना चाहिए, पूरे अनुक्रम को – noisesmith

4

आप उच्च स्तर के कार्यों के साथ ऐसा करना चाहते हैं, तो मुझे लगता है कि iterate अच्छी तरह से यहाँ काम करेगा:

(defn tails [xs] 
    (concat (take-while seq (iterate rest xs)) '(())) 

हालांकि, मैं इस मामले में लगता है कि यह क्लीनर हो बस इसे लिखने के साथ होगा lazy-seq:

(defn tails [xs] 
    (if-not (seq xs) '(()) 
    (cons xs (lazy-seq (tails (rest xs)))))) 
+0

पर बल देने के लिए कॉल धन्यवाद ([1 2 3 4] (2 3 4) (3 4) (4)()) पहला क्यों एक वेक्टर रूप में है? – hariszaman

+1

@hariszaman ऐसा इसलिए है क्योंकि फ़ंक्शन लागू किए बिना पहले दोहराव खुद ही देता है। फिर यह 'आराम' लागू करना शुरू करता है जो 'चंक्डसेक' देता है जो सूची के समान ही प्रिंट करता है। – soulcheck

1

एक तरह से आप ऐसा कर सकते

(defn tails [coll] 
    (take (inc (count coll)) (iterate rest coll))) 
+3

यह किसी भी आलसी इनपुट – noisesmith

+0

हां, गिनती के कारण मजबूर करेगा। मैंने वास्तव में इसके बारे में नहीं सोचा था। – turingcomplete

0
(defn tails 
    [s] 
    (cons s (if-some [r (next s)] 
      (lazy-seq (tails r)) 
      '(())))) 
+0

अगर कुछ है तो? – galdre

+0

https://clojure.github.io/clojure/clojure.core-api.html#clojure.core/if-some –

+0

ओह। हे। मुझे लगता है कि मेरा आरईपीएल 1.5 चल रहा है। – galdre

0

याहू के द्वारा होता है! एक और एक:

(defn tails [coll] 
    (if-let [s (seq coll)] 
     (cons coll (lazy-seq (tails (rest coll)))) 
     '(()))) 

यह वास्तव में सिर्फ क्या reductions हुड के नीचे करता है। सबसे अच्छा जवाब, वैसे, ez121sl's है।