Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

241
Vistas
Este código se ejecuta para grid<=11 pero se atasca para siempre para grid>=12. ¿Alguien puede explicar por qué sucede esto? (Usando la biblioteca p5.js de JavaScript)

Básicamente el título. He leído cada línea muchas veces y todavía no puedo encontrar mi error. Solo estoy tratando de poner cuadrados en una cuadrícula llamando a una función recursiva que crea el objeto y luego se vuelve a llamar a sí misma. He comprobado que la recursión no es infinita y hay una condición de salida simple. Por favor ayuda.

 let grid = 11; let sqr = []; function setup() { createCanvas(grid * grid, grid * grid); noFill(); colorMode(HSB); noLoop(); let maxs = floor(grid / 3); let ratio = 2 * maxs * maxs; makegrid(maxs, ratio); } function draw() { background(0); for (let sq of sqr) sq.show(); } function makegrid(m, r) { if (!m) return; if (m == floor(grid / 3)) { for (let i = 0; i < 2; i++) sqr.push(new sqrs(m, r)); m--; makegrid(m, r); } else { let j = r / (m * m); for (let k = 0; k < j; k++) sqr.push(new sqrs(m, r)); m--; makegrid(m, r); } } class sqrs { constructor(m, r) { let flag = true; this.s = (m * width) / grid; while (flag) { flag = false; this.x = (width / grid) * floor((grid + 1 - m) * random()); this.y = (height / grid) * floor((grid + 1 - m) * random()); if (!sqr.length) flag = false; else { for (let sq of sqr) { let d = (this.x - sq.x) ** 2 + (this.y - sq.y) ** 2; if (d < this.s ** 2 || d < sq.s ** 2) { flag = true; break; } } } } } show() { stroke(random(340), 80, 80); square(this.x, this.y, this.s); } }
about 4 years ago · Juan Pablo Isaza
1 Respuestas
Responde la pregunta

0

Como Jay señaló en los comentarios, no es la recursión el problema, sino el ciclo while (flag) en su constructor sqrs que es el problema:

 let grid = 12; let sqr = []; function setup() { createCanvas(grid * grid, grid * grid); noFill(); colorMode(HSB); noLoop(); // maxs will be 4 if grid is 12 let maxs = floor(grid / 3); // ratio will be 32 let ratio = 2 * maxs * maxs; makegrid(maxs, ratio); } function draw() { background(0); for (let sq of sqr) sq.show(); } function makegrid(m, r) { if (m <= 0) return; if (m == floor(grid / 3)) { // Call 0: m == floor(grid / 3) == 4 for (let i = 0; i < 2; i++) sqr.push(new sqrs(m, r)); m--; // Call 0: makegrid(3, 32); makegrid(m, r); } else { // Call 1: j = 32 / (3 * 3) = 3.55555 // Call 2: j = 32 / (2 * 2) = 8 // Call 3: j = 32 / (1 * 1) = 32 let j = r / (m * m); for (let k = 0; k < j; k++) sqr.push(new sqrs(m, r)); m--; // Call 1: makegrid(2, 32) // Call 2: makegrid(1, 32) // Call 3: makegrid(0, 32) makegrid(m, r); } } class sqrs { constructor(m, r) { let flag = true; this.s = (m * width) / grid; // This code might end up repeating forever because every randomly generated // position is too close to some existing square let count = 0; while (flag && ++count < 1000) { flag = false; this.x = (width / grid) * floor((grid + 1 - m) * random()); this.y = (height / grid) * floor((grid + 1 - m) * random()); if (sqr.length) { // Check if the new square is too close to any existing squares for (let sq of sqr) { let d = (this.x - sq.x) ** 2 + (this.y - sq.y) ** 2; if (d < this.s ** 2 || d < sq.s ** 2) { flag = true; break; } } } } if (flag) { this.s = 0; print(`gave up after ${count} attempts to find a position for this square.`); } } show() { stroke(random(340), 80, 80); square(this.x, this.y, this.s); } }
 <script src="https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.4.0/p5.js"></script>

La lógica en ese bucle while no tiene mucho sentido para mí, así que tendrás que describir lo que realmente estás tratando de hacer si quieres más consejos.

about 4 years ago · Juan Pablo Isaza Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda