2010-09-19 3 views
1
(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 раз?положить код clojure в петлю

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

ответ

0

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

(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))))))) 
+0

как я обернуть это время, чтобы получить время exeuction? – peter

+0

Оберните свой звонок для проверки во времени. '(time (test 100))' – Rayne

+0

Код никогда не меняет значение n. Это эквивалентно исходному коду плаката, для любого n больше 0. –

0

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

(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
(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} 
Смежные вопросы