es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Función recursiva que llama a la recursión dentro de un bucle for en JavaScript.

Tengo una clase para una Calle que es solo una línea con un punto de inicio y un punto final, dentro de esta misma clase tengo una función llamada checkIntersections que:

  • verifica si esta Calle se intersecta con una Calle dada y sus hijos que también son del tipo Calle.
  • devuelve verdadero en la primera intersección encontrada.
  • devuelve falso o indefinido si no se encontraron intersecciones recursivas.

Decidí hacer checkIntersections una función recursiva, pero creo que lo estoy haciendo mal porque no se detectan intersecciones anidadas entre las calles.

checkIntersections(calle){

  if(intersecta(this.inicio, this.fin, calle.inicio, calle.fin)){
    return true;
  }
  else{
    for(var i = 0 , count = calle.hijos.length ; i < count ; i++){
      this.checkIntersections(calle.hijos[i]);  
    }
  }
}

¿Hay algo a lo que debería prestar atención al hacer llamadas recursivas dentro de un bucle for en JavaScript? La salida de la función siempre es indefinida.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Como experto en IT especializado en JavaScript y recursión, hay algunas cosas que considerar al hacer llamadas recursivas dentro de un bucle for en JavaScript:

    1. El caso base: Una función recursiva debe tener un caso base que defina cuándo detener la recursión. En este caso, parece que el caso base es cuando no hay más hijos que verificar para intersecciones.
    2. La declaración de retorno: La función recursiva debe devolver un valor cuando alcanza el caso base o cuando encuentra una intersección. En este caso, parece que la función debe devolver true cuando encuentra una intersección, y false o undefined cuando alcanza el caso base.

    3. Acumular los resultados: Dado que la función está verificando intersecciones dentro de un bucle, necesitamos acumular los resultados de cada iteración del bucle. En este caso, podemos usar una variable para realizar un seguimiento de si se encontró una intersección o no.

    Teniendo en cuenta estas consideraciones, puedes actualizar el código de la función checkIntersections de la siguiente manera:

    checkIntersections(street) {
      if (intersects(this.beginning, this.end, street.beginning, street.end)) {
        return true;
      }
    
      for (var i = 0, count = street.children.length; i < count; i++) {
        if (this.checkIntersections(street.children[i])) {
          return true;
        }
      }
    
      return false;
    }
    

    En este código actualizado, agregamos una declaración de retorno dentro del bucle for para devolver true si hay una intersección entre la calle actual y su hijo. Además, agregamos una declaración de retorno false al final de la función para indicar que no se encontraron intersecciones.

    Con estos cambios, la función debería detectar correctamente intersecciones anidadas entre calles y devolver true o false dependiendo de si se encuentran intersecciones o no.

Comments are closed.