Foros del Web » Programando para Internet » Javascript »

Problema con la recursividad

Estas en el tema de Problema con la recursividad en el foro de Javascript en Foros del Web. Buenas, después de buscar por el foro y por internet en general, me he desesperado y he venido aquí. Estoy intentando crear un árbol de ...
  #1 (permalink)  
Antiguo 27/12/2012, 08:49
 
Fecha de Ingreso: noviembre-2012
Mensajes: 10
Antigüedad: 12 años
Puntos: 0
Problema con la recursividad

Buenas,

después de buscar por el foro y por internet en general, me he desesperado y he venido aquí.

Estoy intentando crear un árbol de directorios con JavaScript. Para ello, recibo del servidor una cadena de texto con las rutas de los archivos y directorios, que separo con "split()" para tener un array de los mismos, quedándome algo así:

[0]raiz/archivo1.txt
[1]raiz/archivo2.txt
[2]raiz/carpeta1
[3]raiz/carpeta1/archivo3.txt
[4]raiz/carpeta2
[5]raiz/carpeta2/archivo4.txt
[6]raiz/archivo5.txt

Esta es la estructura que he creado para poder comprobar que funciona siempre. No tengo ningún problema para recorrer el array, ni para detectar si es un archivo o un directorio. El código de la función recursiva que uso es este:

Código Javascript:
Ver original
  1. function crearArbol(ruta,nivel) {
  2.  
  3.  nivel++;
  4.  
  5.  for (i=0;i<elementos.length;i++) {
  6.  
  7.   elemento = elementos[i];
  8.  
  9.   elemento2 = elemento.split("/");
  10.  
  11.   nombre = elemento2.pop();
  12.  
  13.   ruta2 = elemento2.join("/");
  14.  
  15.   if (ruta2 == ruta) {
  16.  
  17.    if (nombre.lastIndexOf(".") != -1) {
  18.  
  19.     document.getElementById("capaCuerpo" + ruta).innerHTML += "<div style='display:inline; margin-left:15px; float:left; clear:both;'>" + nombre + "<br></div>";
  20.  
  21.    } else {
  22.  
  23.     document.getElementById("capaCuerpo" + ruta).innerHTML += "<div style='display:inline; float:left; clear:both'><img id='capa" + elemento + "' src='icono_arbol_mas.jpg' onclick='arbolMostrarOcultarCuerpo(this.id)' style='cursor:pointer; float:left; margin-right:5px; margin-top:3px;'><div style='display:inline; cursor:pointer; float:left;' onclick='crearCapaVer(" + "\"" + elemento + "\"" + ")'>" + nombre + "</div><div id='capaCuerpo" + elemento + "' style='display:block; margin-left:" + 15*(nivel+1) + "px;'></div></div>";
  24.  
  25.     crearArbol(elemento,nivel);
  26.  
  27.    }
  28.  
  29.   }
  30.  
  31.  }
  32.  
  33. }

Los innerHTML funcionan perfectamente. Llamo inicialmente a la función con un:

crearArbol(elementos,-1);

donde elementos es el array.

El problema que tengo es que, al llamarse a si misma la función, la nueva iteración funciona bien, pero la iteración anterior, la que ha llamado a la segunda, no sigue su curso. Es decir, en el ejemplo del array que he puesto, se detiene en "raiz/carpeta1/archivo3.txt".

Si me pudieran ayudar me harían un gran favor, ya que llevo días intentando resolver esto.

Gracias.
  #2 (permalink)  
Antiguo 27/12/2012, 08:55
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 6 meses
Puntos: 839
Respuesta: Problema con la recursividad

Porque estás reescribiendo el valor de i en el ámbito global. Prueba:
Código Javascript:
Ver original
  1. for (var i = 0; i < elementos.length; i++) {
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.
  #3 (permalink)  
Antiguo 27/12/2012, 09:15
 
Fecha de Ingreso: noviembre-2012
Mensajes: 10
Antigüedad: 12 años
Puntos: 0
Respuesta: Problema con la recursividad

Dios mio... no puede ser!

Aunque tiene mucho sentido. en cada iteración se crea una nueva variable i, y antes se creaba una y se modificaba cada vez, no?

Muchísimas gracias, de verdad, funciona a la perfeccion.,
  #4 (permalink)  
Antiguo 27/12/2012, 09:43
Avatar de David
Moderador
 
Fecha de Ingreso: abril-2005
Ubicación: In this planet
Mensajes: 15.720
Antigüedad: 19 años, 6 meses
Puntos: 839
Respuesta: Problema con la recursividad

Cita:
Iniciado por gbmcarlos Ver Mensaje
Aunque tiene mucho sentido. en cada iteración se crea una nueva variable i, y antes se creaba una y se modificaba cada vez, no?
No es en cada iteración, sino cada vez que se inicia el for (al llamar recursivamente a la función)

Siempre hay que tener cuidado con las variables globales.

Saludos.
__________________
Por favor, antes de preguntar, revisa la Guía para realizar preguntas.

Etiquetas: directorios, funcion, recursividad, arboles
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 09:13.