Last active
July 5, 2022 13:34
-
-
Save timmc/3036120 to your computer and use it in GitHub Desktop.
Factorial in Clojure without using alphanumeric characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
;; It all started here: http://clojure-log.n01se.net/date/2011-04-06.html#19:04 | |
(#((% (+(*))) %) ;; call arg 1 with all args | |
[;; data | |
(+ (*)(*)(*)(*)(*)(*)(*)) | |
;; main fn -- simulate 'if' with map lookup and closures | |
#(({(+) (% (+(*)(*)))} ;; if zero return 'then' clause | |
(% (+)) ;; dispatch on first arg | |
(% (+(*)(*)(*)))) ;; call 'else' clause (n not found in map) | |
%) | |
;; These clauses are given the same args as main fn. | |
;; base case ('then') | |
#({} % (+(*))) ;; constant fn of 1 | |
;; recursive case ('else') | |
#(* ((% (+(*))) | |
[(- (% (+)) (+(*))) | |
(% (+(*))) | |
(% (+(*)(*))) | |
(% (+(*)(*)(*)))]) | |
(% (+)))]) | |
;; => 5040 | |
;; Here's a simpler version that uses "if": | |
(#(% [% (+ (*)(*)(*)(*)(*)(*)(*))]) | |
#(if (= (% (*)) (+)) | |
(*) | |
(* ((% (+)) | |
[(% (+)) (- (% (*)) (*))]) | |
(% (*))))) | |
;; => 5040 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment