Condiciones en Clojure para construir una cadena y actualizar una variable.
Pensé en probar Clojure, haciendo un rompecabezas que imprime una ruta desde el inicio hasta el objetivo. Mi intento no imprime nada.
Entiendo que he escrito esto de manera procedural, pero no estoy seguro de la mejor manera de pensar en escribir esto de manera funcional. Así que me gustaría entender por qué no imprime nada, cómo hacer que una condición ejecute 2 acciones (es decir, agregar la dirección a la cadena y actualizar la posición. Todos los ejemplos que encontré en línea ejecutan solo 1 acción), así como cómo hacer que esto funcione realmente. Idealmente, cómo hacer que funcione mi enfoque y también cuál sería el enfoque ideal en Clojure.
(defn -main [& args]
(def x 2)
(def y 3)
(def t_x 10)
(def t_y 15)
(while true
(let [m ""]
(cond
(> y t_y) (let [m (str m "N")]) (- y 1)
(< y t_y) (let [m (str m "S")]) (+ y 1)
(> x t_x) (let [m (str m "W")]) (- x 1)
(< x t_x) (let [m (str m "E")]) (+ x 1))
; Una sola línea que proporciona el movimiento que se debe realizar: N NE E SE S SW W o NW
(println m)))))
Gracias.
davy.ai
Hay varios problemas con el código proporcionado:
while
se ejecuta indefinidamente y nunca se detiene. En Clojure, podemos usar la recursión en su lugar.let
dentro de la instruccióncond
no actualizan los valores dex
,y
om
. Necesitamos usar las formas de asignacióndef
olet
para actualizar los valores.m
se redefine en cada asignaciónlet
, por lo que los cambios no se mantienen. Podemos definirm
fuera de la instruccióncond
y actualizarlo dentro de cada asignaciónlet
.Aquí tienes una versión revisada del código que debería funcionar:
En esta versión, definimos una nueva función
print-path
que toma cuatro argumentosx
,y
,t-x
yt-y
. Dentro de la función, usamos la forma de asignaciónlet
para definir la variablem
como una cadena vacía. Luego, dentro de la instruccióncond
, usamos la formado
para actualizar el valor dem
y llamar recursivamente aprint-path
con valores actualizados dex
yy
.Podemos simplificar aún más la función usando las funciones
if
ystr
de Clojure:En esta versión, definimos una variable
dir
utilizando una instruccióncond
y actualizamos los valores dex
ey
en función de la dirección. También comprobamos sidir
está vacío para terminar la recursión cuando alcanzamos el objetivo. Usamos la formarecur
para llamar a la función con valores actualizados dex
ey
. La funciónprint
se utiliza para imprimir la dirección en la consola.