Pregunta novata de loops

26 views
Skip to first unread message

José Luis Romero

unread,
Jun 27, 2010, 7:33:38 PM6/27/10
to clojure-hispano
Buenas. Estoy aprendiendo Clojure y lo que he probado me ha gustado
bastante, sin embargo estoy estancado con los loops. Estoy probando
aprender Clojure resolviendo problemas sencllos que los saco de
codingbat.com. Estoy tratando de resolver un problema que dice algo
como que dados 2 parametros, una cadena y un entero, devolver la
cadena concatenada n veces. Por ejemplo, dados los parametros "codigo"
y 3, devolver "codigocodigocodigo". Si existe una manera sin loops
para realizaro perfecto, pero me gustaria mucho alguna explicacion
usando loops para tomarle el truco al loop

Muchas gracias por adelantado

Sebastián Galkin

unread,
Jun 27, 2010, 8:05:22 PM6/27/10
to clojure-hispano
Sin duda que loop/recur no es lo que más conviene, pero si lo querés
hacer así podes intentar algo como:

(defn f [s n]
(if (< n 2)
s
(recur (str s s) (dec n))))


Fijate que no hace falta usar loop, porque es implícito en la línea de
definición de la función, alcanza con el recur.

Saludos

José Luis Romero

unread,
Jun 27, 2010, 9:04:44 PM6/27/10
to clojure-hispano
y otra duda que me sale es, por que se repite mas veces de la cantidad
que se le pasa por parametro? disculpen la necedad pero me interesa
aprender =D

Saludos

Sebastián Galkin

unread,
Jun 27, 2010, 9:55:53 PM6/27/10
to clojure-hispano
Porque tiene un bug horrible jeje.

Estoy concatenando el resultado parcial con sí mismo, en vez de
concatenar el resultado parcial con el string original.

(defn f [s n]
(loop [res s n n]
(if (< n 2)
res
(recur (str res s) (dec n)))))

Creo que ahora anda, perdón

tang...@gmail.com

unread,
Jun 27, 2010, 10:00:44 PM6/27/10
to clojure...@googlegroups.com
No vale, mas bien muchas gracias por tomarte el tiempo para ayudarme. Saludos
Enviado desde mi BlackBerry de Movistar

Marcelo Morales

unread,
Jun 28, 2010, 8:15:36 AM6/28/10
to clojure...@googlegroups.com
2010/6/27 José Luis Romero <tang...@gmail.com>:

loop es el abuelo:
(defn f [s n]
(loop [r "" c n]
(if (= c 0)
r
(recur (str r s) (dec c)))))

Pero también puedes hacerlo como copiando, línea a línea, de Java:
(defn f [s n]
(let [sb (StringBuilder.) c (* n (count s))]
(do
(while (> c (.length sb))
(.append sb s))
(str sb))))

Claro que la solución funcional es más sencilla:
(defn f [s n] (->> s (repeat) (take n) (apply str)))


--
Marcelo Morales

Jose Luis Romero

unread,
Jun 28, 2010, 9:32:39 AM6/28/10
to clojure...@googlegroups.com
Gracias por los approachs.. seguire, como decimos aqui, tirando piedras con Clojure... espero me sigan ayudando.

Saludos
Reply all
Reply to author
Forward
0 new messages