2011-05-02 3 views
13

estoy trabajando a través Clojure Koanes y estoy hasta los koans recursividad.Clojure Koanes es recursivo, incluso?

No entiendo cómo resolver is-even? utilizando la recursividad. El ejercicio define parcialmente esta función como:

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

Si no quiero usar la recursividad entonces yo lo definiría como (defn is-even? [n] (= (mod n 2) 0)) pero eso va en contra del objetivo del ejercicio.

Respuesta

15

Como dijo amalloy, llene los espacios en blanco con "not". Pero con tal que usted asume el argumento sólo puede ser 0 o positivo, que no necesito otro caso base: dec se asegura de que siempre terminan en 0, y los números impares return false así:

(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 

etcétera.

0

Considere disminuyendo por 2 para cada recursividad. El resto debería ser obvio: el número es par sólo si la función termina con cero.

EDITAR: Aparentemente me perdí la nota acerca de cómo llenar el espacio en blanco. Aquí está la solución optimizable llamada de cola que tenía en mente para los enteros positivos:

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

puede usar la función 'recur' para optimizar la cola de llamada –

9

Un número n es aún si:

  1. n es 0
  2. n-1 ni siquiera es

Así que realmente, not debería ser suficiente para completar ese espacio en blanco. Con el tiempo que terminan con N not s alrededor (= 0 0), y la mayoría de ellos se cancelan.