2017-04-13 36 views
-1
(defn factorial [n fact] 
     (if <= n 1) 
      fact 
    (factorial (- n 1) (* n fact))) 


(defn fact [n] 
    (factorial (n 1))) 
+1

不應該[n事實]只是[n]。 (因子(n 1))只是(因子1)(我幾乎不知道clojure,但似乎可疑) – Novaterata

+0

@Novaterata是正確的。另外,你的if語句是錯誤的,它需要是'(if(<= n 1)then else') – Shlomi

回答

3

它看起來像你想要寫階乘使用參數滿足總,但是你的括號是不完全正確。

(factorial (n 1)) 

因爲n是在列表中的第一個項目,它被作爲函數調用。但作爲一個數字,它不能這樣使用。

要調用的階乘函數(其中n爲輸入和1作爲初始總數),您可能意味着

(defn fact [n] 
    (factorial n 1)) 

有你的階乘函數的其他問題。

(if <= n 1) 

<=是一個函數,所以它需要作爲參數傳遞給,如果

(if (<= n 1) 
    ... 

遞歸調用階乘使用時被稱爲是相當多的,你想要什麼您的解決方案,但有」重一些不匹配的括號,這裏就是你可能是指

(defn factorial [n fact] 
    (if (<= n 1) 
     fact 
     (factorial (- n 1) (* n fact)))) 

然而,有正確性/成語俚語的Clojure的位可以使用,這裏有一個稍微有tter的方式做您的完整的解決方案

(defn factorial [n total] 
    (if (<= n 1) 
    total 
    (recur (dec n) (* n total)))) 

(defn fact [n] 
    (factorial n 1)) 

儘管如此,如果你使用的調用堆棧進行總,你可以做的稍微好一點的

(defn factorial [n] 
    (if (<= n 1) 
     1 
     (* n (factorial (dec n))))) 

你可以重組這種略帶使用recur,這將給你稍微好一些的表現,但我認爲這是一個學術練習,你可以看看其他答案(例如Alan Thompson's answer)。

相關問題