(defn upto "Get the numbers from 1 to n." [n] (range 1 (inc n)))
This can be extended to a nested upto function:
(defn nested-upto "Compute the numbers upto n nested by k." [n k] (cond (= k 0) 1 (= k 1) n :else (map #(nested-upto % (dec k)) (range 1 (inc n)))))
Here is upto 5 at different levels of nesting to show what I mean:
(1 2 3 4 5) ((1) (1 2) (1 2 3) (1 2 3 4) (1 2 3 4 5)) (((1)) ((1) (1 2)) ((1) (1 2) (1 2 3)) ((1) (1 2) (1 2 3) (1 2 3 4)) ((1) (1 2) (1 2 3) (1 2 3 4) (1 2 3 4 5)))
The multichoose function I talked about previously can now be implemented using nested ranges:
(defn multichoose [n k] (apply + (flatten (list (nested-upto n k)))))
This demonstrates this basic mathematical principle.
No comments:
Post a Comment