2017-10-02 4 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) 

Fehler: Ausnahme im Thread "main" java.lang.IllegalArgumentException: Schleife benötigt einen Vektor für seine Bindung.Faktorisches iteratives ungültiges Argument - clojure

Ich versuche eine Funktion zu schreiben, die eine faktorielle Zahl auswertet. Wo ist mein Fehler? Es gibt mir 1 als Antwort

+1

Sind Sie sicher, dass Sie den Code hier eingefügt haben, als Sie ihn tatsächlich ausgeführt haben? Für mich geht das. Es druckt "1". –

+0

@NathanDavis ich versuche, 120 – iyazici

+2

zu finden Ok, vielleicht habe ich Ihre Frage falsch gelesen. Aber wie kommt das Bit über 'java.lang.IllegalArgumentException: loop benötigt einen Vektor für seine Bindung' ins Spiel? –

Antwort

1

Auf den ersten Blick:

  • Sie kein def in einem defn verwenden.
  • Die REPL wird das Ergebnis der Auswertung einer Funktion ausgeben. Benutze es.

Dies bringt uns zu

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

..., die nicht kompiliert, da result schwimmt.

Es gibt ein paar Korrekturen erforderlich:

  • Return i, nicht result.
  • Start i bei 1, nicht n.
  • Drehen Sie den Test um: > anstelle von <=.

Wir am Ende mit

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

... das funktioniert:

(fac 5) 
=> 120 

Edited Einmal Fehler zu korrigieren und eine Erklärung zu verbessern.

+0

Danke, aber ich kann nicht aus der Schleife drucken – iyazici

Verwandte Themen