2016-10-24 3 views
1

루프/반복을 사용하여 숫자의 모든 요소 벡터를 반환하는 factors 함수를 정의하려고합니다.루프/반복 함수의 PersistentVector 전달 된 인수 개수가 잘못되었습니다.

;; `prime?` borrowed from https://swizec.com/blog/comparing-clojure-and-node-js-for-speed/swizec/1593 

(defn prime? [n] 
    (if (even? n) false 
     (let [root (num (int (Math/sqrt n)))] 
     (loop [i 3] (if (> i root) true 
         (if (zero? (mod n i)) false 
          (recur (+ i 2)))))))) 

(defn factors [x] (
    (loop [n x i 2 acc []] 
    (if (prime? n) (conj acc n) 
     (if (zero? (mod n i)) (recur (/ n i) 2 (conj acc i)) 
      (recur n (inc i) acc)))))) 

는하지만 다음과 같은 오류로 실행 계속 : 여기 분명 뭔가 빠진해야

ArityException Wrong number of args (0) passed to: PersistentVector clojure.lang.AFn.throwArity

. 어떤 제안이라도 대단히 감사합니다!

답변

5

나를 잘못이 무엇인지에 대한 분명한 그래서 코드에서 공백을 이동하자

(defn factors [x] 
    ((loop [n x i 2 acc []] 
    (if (prime? n) (conj acc n) 
     (if (zero? (mod n i)) (recur (/ n i) 2 (conj acc i)) 
      (recur n (inc i) acc)))))) 

당신은 참조 함수의 시작 부분에서 이상한 ((인가? 그게 다 뭐야? Clojure에서 일반적으로 리스프 (lisp)와 마찬가지로 괄호 은 그룹화 구문이 아닙니다.! 그것들은 함수 호출 메카니즘이며, 그냥 재미있게 보충 할 수는 없습니다. 여기에 쓴 내용의 의미는 다음과 같습니다.

  1. Run this loop that will compute a vector.
  2. Call the resulting value as a function, passing it no arguments.
+0

와우, 좋아. 이 괄호를 추적하는 것이 더 중요합니다. 여분의 괄호 세트를 제거하는 트릭을 ... 고마워! – user1797455

관련 문제