2016-09-22 3 views
0

wandere ich nur, wenn es eine Reduzierung in Clojure, die das gleiche Ergebnis wie die unten Funktion geben kann, ohne Rekursionbekommen Kombinationen von Vektorelementen

die Funktion einen Vektor nehmen sollte und gibt Kombinationen der Elemente (zB geben [ 2 1 3] und kehrt zurück ((1 2 3) (1 2) (1 3) (1) (2 3) (2) (3) []))

(def combinations 
"creates combinations of items for example [1 2 3] 
will generate ((1 2 3) (1 2) (1 3) (1) (2 3) (2) (3) [])" 
(memoize (fn[items] 
(if (empty? items) [[]] 
(let [els (combinations (rest items))] 
    (concat (map #(cons (first items) %)els) els)))))) 

Antwort

3

Ein alternativer Ansatz sein würde Verwende eine Clojure Math-Bibliothek.

Für Leiningen project.clj hinzufügen this- [org.clojure/math.combinatorics "0.1.3"]

(ns example.core 
    (:require [clojure.math.combinatorics :as c])) 

(c/subsets [1 2 3]) 
;;=> (() (1) (2) (3) (1 2) (1 3) (2 3) (1 2 3)) 

Sie können bedienen-den Quellcode here für eine Rekursion lose Lösung sehen, ob nicht die lib wollen.

Verwandte Themen