2011-05-02 2 views
13

나는 Clojure Koans를 통해 일하고 있으며 재귀 koans에 달려있다.Clojure Koans는 반복적 인 is-even입니까?

재귀를 사용하여 is-even?을 해결하는 방법을 모르겠다. 그때 내가 (defn is-even? [n] (= (mod n 2) 0))로 정의 할 재귀를 사용하지 않으려는하지만이 운동의 점에 반하는 경우

(defn is-even? [n] 
    (if (= n 0) 
     true 
     (__ (is-even? (dec n))))) 

: 운동은 부분적으로이 기능을 정의합니다.

답변

15

amalloy와 마찬가지로 공백을 "not"로 채 웁니다. dec는 항상 0에서 결국 확인합니다, 홀수 번호는 다음과 같이 false를 반환 :하지만 인수는 0 또는 양, 당신은 다른 기본 케이스를하지 않아도 될 수 있습니다 가정하여 제공된

(is-even? 0) ==> base case (= 0 0) ==> true. 
(is-even? 1) ==> (not (is-even? (dec 1)) 
      ==> (not (is-even? 0)) 
      ==> (not true) 
      ==> false 
(is-even? 2) ==> (not (is-even? 1)) 
      ==> (not false) 
      ==> true 

등등을.

0

각 재귀마다 2 씩 감소하는 것을 고려하십시오. 나머지는 분명해야합니다 : 숫자는 함수가 0으로 끝나는 경우에도 마찬가지입니다.

편집 : 분명히 나는 ​​공백을 채우는 것에 대한 메모를 놓쳤다.

(defn is-even? [n] 
    (if (<= n 1) 
     (= n 0) 
     (is-even? (- n 2)))) 
+0

꼬리 호출 최적화를 위해'recur' 함수를 사용할 수 있습니다 –

9

숫자 n도 하나 경우입니다 :

  1. n 0
  2. n-1에도
되지 않습니다 여기에 내가 양의 정수에 대한 생각했던 꼬리 호출 최적화 할 솔루션입니다

정말 그렇습니다. not은 그 빈칸을 채우기에 충분합니다. 결국 N not(= 0 0) 주위와 바람, 그리고 대부분 취소합니다.

관련 문제