Foros del Web » Programando para Internet » Javascript »

[aporte] bucle anidado en uno

Estas en el tema de [aporte] bucle anidado en uno en el foro de Javascript en Foros del Web. estoy seguro que mas de uno alguna vez hemos usado los benditos bucles anidados por alguna razon pero principalmente porque se requiere recorrer dos estructuras. ...
  #1 (permalink)  
Antiguo 24/11/2010, 01:43
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
[aporte] bucle anidado en uno

estoy seguro que mas de uno alguna vez hemos usado los benditos bucles anidados por alguna razon pero principalmente porque se requiere recorrer dos estructuras. personalmente a mi me irrita ver bucles anidados, pero no porque sean inneficientes sino porque esteticamente no son atractivos. en ciertos casos particulares no hay otra opcion que recurrir a dicha estructura, por ejemplo cuando se intenta interrumpir el ciclo con break/continue en un bucle externo. de todos modos, me refiero por ejemplo el siguiente bucle anidado.
Código:
for(var i = 0, a = ["blanco", "gris", "marron", "amarillo"]; 
i < a.length; i++){
for(var j = 0, b = ["gato", "ganado", "caballo", "perro", "gallo"]; j < b.length; j++) document.write(b[j], " ", a[i], "<br />");
}
estaba pensando si habia alguna forma de hacer lo mismo pero con un solo bucle. no me sorprenderia si alguien alguna vez [en la web o en mundo de desarrollo] ya habia propuesto un cuestionamiento similar con alguna solucion. intente buscar pero no se si tiene algun nombre particular que desconozco. en fin, este es el mismo ejemplo pero con un solo bucle.
Código:
for(var i = 0, j = 0, a = ["blanco", "gris", "marron", "amarillo"], b = ["gato", "ganado", "caballo", "perro", "gallo"]; 
j < b.length; 
j+= Math.floor(++i/a.length), i%= a.length) document.write(b[j], " ", a[i], "<br />");
lo cierto es que es un tanto esoterico para los que no estamos acostumbrados a expresiones complejas en un bucle. adicional, lo mas seguro en la practica nadie se acordara la logica que esconde. el ejemplo simula hasta solo dos bucles; mas de dos no lo intente porque en la practica rara vez he visto la necesidad de tres bucles anidados. intente hacerlo lo mas simplicado que me permite mi torpe cabeza en calculos. estoy seguro que debe haber alguna otra forma mas simplificada aun, pero aun no alcanzo ese nivel. en lugar de explicarle, se los dejo para que lo analicen porque la verdad no sabria por donde comenzar a explicarlo sin complicarlo.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #2 (permalink)  
Antiguo 24/11/2010, 02:22
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: [aporte] bucle anidado en uno

Hola zerokilled:

Curioso ejemplo... bueno, como a mi no me importa anidar bucles, tal vez no lo llegue a utilizar, pero sin duda es un buen aporte.

Lo que se me ocurre, es que podría ser algo menos eficiente que los bucles anidados al tener que realizar cálculos adicionales en cada paso del bucle (recuerdo que operaciones de división y módulos ocupaban más ciclos de reloj en los procesadores 8086/8088... -los que estudié en su día-) ... y también se me ocurre en vez de Math.floor, podría usarse un simple parseInt (aunque no puedo saber si se mejora en algo el código... el comentario es porque si mal no recuerdo, Math floor redondea "a la baja", que equivaldría justamente al parseInt, o incluso Math.abs)

Mi enhorabuena.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #3 (permalink)  
Antiguo 24/11/2010, 02:57
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: [aporte] bucle anidado en uno

buenas caricatos,

no se me habia ocurrido realizar pruebas de rendimientos y tienes toda la razon. hice una prueba al azar y los resultados son exagerados pero en general dos bucles son aprox. 93% mas rapido que con un bucle emulando a dos. sabes, una vez mas me vuelve a suceder esta susodicha. quiero decir, en el reto de fibonacci tenia el capricho de hacer el codigo lo mas simplificado posible pero resulto ser inneficiente. esta ocasion a sido similar. por lo menos el concepto existe, que era la intencion que queria compartir.

pd: habia pensando en parseInt pero creia que parseInt redondeaba al entero mas proximo.
saludos
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #4 (permalink)  
Antiguo 24/11/2010, 03:08
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: [aporte] bucle anidado en uno

Hola:

¡Je, je!, ahora me dejas a mí en la duda, pero me parece que simplemente elimina la parte fraccionada del resultado/número... pero lo que tengo claro es que tanto floor como ceil sí que aproximan el redondeo, por eso lo del comentario de abs...

Ahora "un jarro de agua fría" (es una expresión)... no existe la obligatoriedad de empezar los bucles por el valor cero... incluso sabemos que también son válidos en vez de números usar letras u otras cosas, pero en tu ejemplo creo que se contemplan... así que si ese bucle debe ir entre 123 y 567 (y no voy a complicarlo más planteando incrementos negativos )...

Bueno, bueno... los comentarios son solo por plantear un debate (¡me encantan los debates!), y reitero mi enhorabuena, ya que es un planteamiento muy interesante.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #5 (permalink)  
Antiguo 24/11/2010, 12:35
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 20 años
Puntos: 834
Respuesta: [aporte] bucle anidado en uno

Interesante experimento. A mi sí me gustan los bucles anidados: a veces son muy útiles para crear escenarios de juegos ;)

Etiquetas: bucle, aportes, anidados
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:15.