2016-08-06 74 views
0

我迷失於下面的代碼,試圖計算平方根。 的代碼是:讓用法調用另一個函數

(defn tempsqrt [x p i] 
    (if (< i 2) 
    p 
    (tempsqrt x (+ (/ x (* 2 p)) (/ p 2)) (- i 1)))) 

(defn mysqrt [x] 
    (let [i 10 
     p (/ x 5)] 
    (tempsqrt x p i))) 

當我在逆時針執行(msqrt 1),看來我得到一個無限循環,因爲我有強行停止處理。 我試圖輸出ipmysqrt,他們似乎計算得很好,我認爲一定有一些愚蠢的問題,但我無法找到它。

+0

可能是一個輸入錯誤 - 你的函數名是'mysqrt',但是你調用的函數是'msqrt'。 ???我認爲它一定是這樣的,因爲你遞歸地調用'tempsqrt'而不是使用'recur'強制執行尾部調用,所以*如果* tempsqrt在無限遞歸循環中被調用,你的棧會在你的顯示器上吹大塊。 (可愛的想法,呃?:-)很清楚(至少在我的腦海中清楚)'tempsqrt'沒有被調用。當然,我可能是錯的 - 但我試過你的代碼,它對我來說工作得很好。祝你好運。 –

+0

我一定是某種錯字,我已經重寫了一切,現在它奇蹟般的工作。感謝大家! – user263416

回答

0

在我的機器上按預期工作。

boot.user=> (defn mysqrt [x] 
     #_=> (let [i 10 
     #_=>   p (/ x 5)] 
     #_=> (tempsqrt x p i))) 
#'boot.user/mysqrt 
boot.user=> (defn tempsqrt [x p i] 
     #_=> (println i) 
     #_=> (if (< i 2) p 
     #_=>  (tempsqrt x (+ (/ x (* 2 p)) (/ p 2)) (- i 1)))) 
#'boot.user/tempsqrt 
boot.user=> (mysqrt 1) 
10 
9 
8 
7 
6 
5 
4 
3 
2 
1 
19323349832288915105454068722019581055401465761603328550184537628902466746415537000017939443193837284332679428868611117710999636580698761476491418202290083264324580207274376284652360489310800028152901586154293130345674316605555829428921442625537/19323349832288915105454068722019581055401465761603328550184537628902466746415537000017939416378221424447485229720561121299307381621967120291704662755167195820796520060180422680903764155503944648089185213182191422837908692712415936561623430457345 
+0

感謝您提供的信息,我已經重新啓動逆時針和REPL在這裏,仍然輸出剛剛停止,即使我輸入新的功能,我沒有得到答覆。沒有日誌,無處...我必須點擊「強行停止當前運行評估」,然後向前... – user263416

+0

嘗試http://clojurians.net/尋求幫助。 –