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

Erreur: Exception dans le thread "principal" java.lang.IllegalArgumentException: la boucle requiert un vecteur pour sa liaison. J'essaye d'écrire une fonction qui évalue un factoriel de nombres. Où est mon erreur? Il me donne 1 réponseArgument Factoriel itératif illégal - clojure

+1

Etes-vous sûr d'avoir collé le code ici lorsque vous l'avez exécuté? Ça marche pour moi. Il imprime '1'. –

+0

@NathanDavis J'essaie de trouver 120 – iyazici

+2

Ok, peut-être que j'ai mal interprété votre question. Mais comment le bit à propos de 'java.lang.IllegalArgumentException: loop nécessite un vecteur pour sa liaison' entre en jeu? –

Répondre

1

A première vue:

  • Ne pas utiliser un def dans un defn.
  • Le REPL affichera le résultat de l'évaluation d'une fonction. Utilise le.

Cela nous amène à

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

... qui ne compile pas, parce que result est flottant.

Il y a quelques corrections nécessaires:

  • Retour i, non result.
  • Démarrer i à 1, et non n.
  • Retournez le test: > au lieu de <=.

Nous nous retrouvons avec

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

... qui fonctionne:

(fac 5) 
=> 120 

modifié pour corriger une erreur unique et d'améliorer l'explication.

+0

Merci, mais je ne peux pas imprimer hors de la boucle – iyazici