में कार्टेशियन उत्पाद मैं एक विधि को लागू करने की कोशिश कर रहा हूं जो सूचियों की एक सूची लेगा और इन सूचियों के कार्टेशियन उत्पाद को वापस लाएगा।क्लोजर
यहाँ मैं अब तक है:
(defn cart
([] '())
([l1] (map list l1))
([l1 l2]
(map
(fn f[x] (map
(fn g [y] (list x y))
l2))
l1)
)
)
(defn cartesian-product [& lists]
(reduce cart lists)
)
;test cases
(println (cartesian-product '(a b) '(c d))) ; ((a c) (a d) (b c) (b d))
(println (cartesian-product())) ;()
(println (cartesian-product '(0 1))) ; ((0) (1))
(println (cartesian-product '(0 1) '(0 1))) ; ((0 0) (0 1) (1 0) (1 1))
(println (apply cartesian-product (take 4 (repeat (range 2))))) ;((0 0 0 0) (0 0 0 1) (0 0 1 0) (0 0 1 1) (0 1 0 0) (0 1 0 1) (0 1 1 0) (0 1 1 1) (1 0 0 0) (1 0 0 1) (1 0 1 0) (1 0 1 1) (1 1 0 0) (1 1 0 1) (1 1 1 0) (1 1 1 1))
समस्या मेरी समाधान वास्तव में 'brackety' है।
(((a c) (a d)) ((b c) (b d)))
()
(0 1)
(((0 0) (0 1)) ((1 0) (1 1)))
(((((((0 0) (0 1)) 0) (((0 0) (0 1)) 1)) 0) (((((0 0) (0 1)) 0) (((0 0) (0 1)) 1)) 1)) ((((((1 0) (1 1)) 0) (((1 0) (1 1)) 1)) 0) (((((1 0) (1 1)) 0) (((1 0) (1 1)) 1)) 1)))
मैं
(apply concat(reduce cart lists))
जोड़ने की कोशिश की लेकिन फिर मैं तो जैसे एक दुर्घटना मिलती है:
((a c) (a d) (b c) (b d))
()
IllegalArgumentException Don't know how to create ISeq from: java.lang.Long clojure.lang.RT.seqFrom (RT.java:494)
तो, मुझे लगता है कि मैं पास लेकिन लापता कुछ कर रहा हूँ। हालांकि, क्योंकि मैं क्लोजर और कार्यात्मक प्रोग्रामिंग के लिए इतना नया हूं, मैं पूरी तरह से गलत ट्रैक पर हो सकता हूं। कृपया सहायता कीजिए! :)
clojure.math.combinatorics (https://github.com/clojure/math.combinatorics/) में एक तेज़ कार्टेशियन उत्पाद है, जो उपयोगी है यदि आप केवल परिणाम चाहते हैं ... –
चीयर्स, यह व्यायाम का अधिक है हालांकि :) –