Encore très nouveau à Clojure et à la programmation en général alors pardonnez la question stupide.Comment renvoyer une séquence paresseuse d'une boucle avec un conditionnel dans Clojure?
Le problème est:
Recherche n et k tel que la somme des nombres jusqu'à n (exclusive) est égale à la somme des nombres de n + 1 à k (y compris).
Ma solution (qui fonctionne très bien) est de définir les fonctions suivantes:
(defn addd [x] (/ (* x (+ x 1)) 2))
(defn sum-to-n [n] (addd(- n 1)))
(defn sum-to-k [n=1 k=4] (- (addd k) (addd n)))
(defn is-right[n k]
(= (addd (- n 1)) (sum-to-k n k)))
Et puis exécutez la boucle suivante:
(loop [n 1 k 2]
(cond
(is-right n k) [n k]
(> (sum-to-k n k) (sum-to-n n))(recur (inc n) k)
:else (recur n (inc k))))
Ce que les retours d'une réponse mais si je mets manuellement n et k je peux avoir des valeurs différentes. Cependant, je voudrais définir une fonction qui retourne une séquence paresseuse de toutes les valeurs de sorte que:
(= [6 8] (take 1 make-seq))
Comment puis-je faire aussi efficacement que possible? J'ai essayé plusieurs choses mais je n'ai pas eu beaucoup de chance.
Merci
: Modifier:
Je pense que je suis venu avec une meilleure façon de le faire, mais son retour "devrait laisser être un vecteur. Clojure docs ne sont pas beaucoup d'aide ...
Heres le nouveau code:
(defn calc-n [n k]
(inc (+ (* 2 k) (* 3 n))))
(defn calc-k [n k]
(inc (+ (* 3 k)(* 4 n))))
(defn f
(let [n 4 k 6]
(recur (calc-n n k) (calc-k n k))))
(take 4 (f))
Dans votre édition, il vous manque le vecteur d'argument pour 'f'. – madstap