2012-10-13 2 views
0

여러 개 포함 된 continue 루프를 만들려고합니다. 내가 현재 가지고하는 것은 이것이다 :루프에서 인수가 여러 개일 때

(defn test [n] 
(loop [x n] 
    (when (> x 1) 
     (println x)) 

    (when (even? x) 
     (recur (- x 1)) 
     (println x)) 
    (when (odd? x) 
     (recur (+ x 2)) 
     (println x)) 
) 

)

Clojure에서이 작업을 수행 할 수있는 가능한 방법이 있나요?

답변

2

코드가 올바르지 않습니다. 숫자가 짝수이거나 홀수이기 때문에 무한 루프가되므로 각 반복마다 항상 recur이 호출됩니다. 또한 정확히 무엇을하고 싶은지 확실하지 않습니다. 문제를 설명하면보다 확실한 답을 줄 수 있습니다.

먼저 종료 조건을 정의해야합니다.이 함수에서 반환 할 대상을 지정 하시겠습니까? 그런 다음 종료 조건이 충족 될 때 recur을 호출하지 않도록 루프를 구조해야합니다. 이 경우 함수는 결국 무언가를 반환합니다.

당신이 당신도, looprecur 같은 낮은 수준의 기본 요소에 의존 map, filterreduce (또는 for 매크로)와 같은 표준 기능을 사용하지 않고 원하는 것을 할 수 있다는 것을 또한 가능성이 높다.

+0

아하 나는 그 기능을 잘못 간과했다. 나는 원자 속에 형태를 적용하는 또 다른 것을 가지고있다. 그러나 그것은 어떤 이유로 프로세스를 계속하지 않는다, 나는 스왑을 사용한다고 생각하고 있었다! 두 번 : (defn이 된 헹크 [N] \t (데프 (원자 N)) \t \t (하면서 (홀수 @a) \t \t \t (에 println a) (스왑 A * 3) (스왑! a + 1) \t \t – user1213904

+0

(swap! a) 2x 이후에 스크립트를 멈추는 일종의 오류를 줄 수 있겠습니까? – user1213904

+0

원자를 사용하는 것은 좋은 생각이 아니며 'def'도 좋습니다. 폼 내부에서 사용하기위한 것이 아니라 최상위 매크로입니다 (로컬 바인딩에는'let'을 사용해야합니다). 다음 링크의 코드는 관용적 인 코드입니다 : https://gist.github.com/ 3886160 –

관련 문제