положить код clojure в цикл - PullRequest
       3

положить код clojure в цикл

1 голос
/ 20 сентября 2010
(def throws 10)

(defn r-squared [x y] 
 (+ (* (- 0.5 x) (- 0.5 x)) 
    (* (- 0.5 y) (- 0.5 y))))

(loop [hits 0]
  (let [x (rand)
        y (rand)]
    ; still inside the let
    (if (< (r-squared x y) 0.25) ;is it a hit or not? if not, try again
        (recur (inc hits)) 
        (* 4 (/ hits throws)))))  

Этот код работает и работает до тех пор, пока условие if не станет истинным.Как я могу переписать его так, чтобы он принимал X в качестве параметра и выполнял X раз?

Я в основном хочу вызвать (r-квадрат 100) и получить, сколько хитов я получил в качестве возвращаемого значения.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2010

Не оценил, так что Парн может быть немного не прав.

(def throws 10)

(defn r-squared [x y] 
 (+ (* (- 0.5 x) (- 0.5 x)) 
    (* (- 0.5 y) (- 0.5 y))))


 (defn test-r-squared [n] 
  (loop [hits (int 0) n (int n)]
   (let [x (rand)
         y (rand)]
    ; still inside the let
    (if (< n 0)
       (* 4 (/ hits throws))
       (if (< (r-squared x y) 0.25) ;is it a hit or not? if not, try again
         (recur (inc hits) (dec n)) 
         (recur hits (dec n)))))))  
0 голосов
/ 22 января 2011
(defn r-squared [x y] 
 (+ (* (- 0.5 x) (- 0.5 x)) 
    (* (- 0.5 y) (- 0.5 y))))

(defn hit[]
  (let [x (rand) y (rand)]
    (< (r-squared x y) 0.25)))


(frequencies (for [i (range 1000)] (hit))) ; {true 787, false 213}
0 голосов
/ 20 сентября 2010

Я думаю, это то, что вы хотите, если правильно понимаете вопрос.

(defn test [n]
  (loop [hits 0 n n]
    (let [x (rand)
          y (rand)]
      (if (< n 0)
          hits ;// you can put (* 4 (/ hits throws)) here
          (if (< (r-squared x y) 0.25)
              (recur (inc hits) (dec n))
              (recur hits (dec n)))))))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...