2017-10-02 6 views
0
(defn fac [n] 
     (def result 1) 
     (loop [i n c 1] 
     (if (<= c 5) 
      result 
      (recur (* c i) (inc c)) 
     ) 
     ) 
     (println result) 
    ) 

    (fac 5) 

エラー:スレッド "main"の例外java.lang.IllegalArgumentException:ループでは、そのバインディングにベクトルが必要です。因果的反復違法引数 - クロージャー

数値の階乗を評価する関数を作成しようとしています。私のミスはどこですか?これは、一見答え

+1

ここに実際にコードを貼り付けてもよろしいですか?わたしにはできる。それは '1'を出力します。 –

+0

@ NathanDavis私は120を見つけることを試みています – iyazici

+2

あなたの質問を誤解しているかもしれません。しかし、 'java.lang.IllegalArgumentException:ループはそのバインディングのためにベクトルを必要とする'についてのビットはどのように動くのでしょうか? –

答えて

1

として私に1を与える:

  • defndefを使用しないでください。
  • REPLは、関数の評価結果を出力します。これを使って。

これはresultが浮いているので、コンパイルされません

(defn fac [n] 
    (loop [i n c 1] 
    (if (<= c 5) 
     result 
     (recur (* c i) (inc c))))) 

...に私たちを取得します。

  • 戻りi、ないresult

    が必要ないくつかの修正があります。

  • iで始まり、nではありません。
  • <=の代わりに>の周りでテストを回します。

    (fac 5) 
    => 120 
    

    編集を一回限りの誤りを訂正し、説明を改善するために:

は、我々は働く...

(defn fac [n] 
    (loop [i 1, c 1] 
    (if (> c n) 
     i 
     (recur (* c i) (inc c))))) 

で終わります。

+0

ありがとうございますが、私はループから抜けることができません – iyazici

関連する問題