J'essaye d'écrire un simple modèle d'espace d'état de Markov, qui, comme son nom l'indique, fait un retour en arrière pour prédire l'état suivant.Clojure boucle et récurrence ou réduire dans le modèle d'espace d'état
Voici ce qui est censé être un MWF, mais ce n'est pas parce que je ne peux pas comprendre tout à fait comment je suis censé placer (recur ...)
dans le code ci-dessous.
;; helper function
(defn dur-call
[S D]
(if (< 1 D)
(- D 1)
(rand-int S)))
;; helper function
(defn trans-call
[S D]
(if (< 1 D)
S
(rand-int 3)))
;; state space model
(defn test-func
[t]
(loop
[S (rand-int 3)]
(if (<= t 0)
[S (rand-int (+ S 1))]
(let [pastS (first (test-func (- t 1)))
pastD (second (test-func (- t 1)))
S (trans-call pastS pastD)]
(recur ...?)
[S (dur-call S pastD)]))))
Mon objectif est de calculer un certain état à dire le temps t=5
dire, dans ce cas, le modèle a besoin de regarder en arrière et de calculer les états t=[0 1 2 3 4]
ainsi. Cela devrait, dans mon esprit, se faire bien avec loop/recur
mais pourrait également être fait avec reduce
peut-être (pas sûr de savoir, encore nouveau pour Clojure). Mon problème est vraiment qu'il devrait utiliser recur
à l'intérieur let
mais cela ne devrait pas fonctionner étant donné comment loop/recur
sont conçus.
C'est tout simplement magnifique! Je suppose que ce que je ne comprends pas, c'est quand utiliser 'loop/recur',' réduire' et 'itérer'. Vraisemblablement, on pourrait faire une récursion de cela aussi? Pourquoi pas toi? – Astrid
mis à jour ma réponse avec la solution récursive. Je ne voudrais pas utiliser la récursivité ici, puisque ce cas est si fréquent, qu'il y a une fonction pour cela. De plus, comme il produit un seq paresseux, ses limites d'utilisation sont beaucoup plus larges en général que les simples boucles (enfin, cela dépend toujours de vos besoins) – leetwinski
Je vois, incroyable réponse monsieur. – Astrid