Computación evolutiva y recursividad
Leí un par de artículos de la computación evolutiva, y he decidido hacer un programilla javascript con ello. Lo que pasa es que me he atrancado en una function recursiva. Esta más o menos hecho con objetos. He simplificado mucho el código centrándome en el problema:
<script>
function Opers(nom) { //clase persona
this.nom=nom;
this.hijos=new Array();
}
function e(t) { document.write(t); }
paco=new Opers("paco");
Nhijo(paco); //paco_0
Nhijo(paco.hijos[0]);
Nhijo(paco); //paco_1
Nhijo(paco.hijos[1]);
Nhijo(paco); //paco_2
//Nhijo(paco.hijos[2]);
//Nhijo(paco) //paco_3
//Nhijo(paco) //paco_4
vez=true;
function hallarUltGen(de) {
e("<p>Trabajamos con <b>"+de.nom+"</b>:<br>");
if(vez) { //la primera vez que se ejecuta.
dev=new Array();
e("Empezando:<br>")
vez=false;
}
if(de.hijos.length==0) { //si no tiene hijos, el es el ultimo. Terminar funct
dev[dev.length]=de;
e("No tiene hijos, añadido a dev.<br>");
}
else{ //si tiene ijos
e("Tiene hijos, "+de.hijos.length+":<br>");
for(a=0;a<de.hijos.length;a++) { //por cada hijo hallar ultGen y terminar la function
e("Llama a la function hallarUltGen con <b>"+de.hijos[a].nom+"</b>:<br><blockquote>")
hallarUltGen(de.hijos[a]);
e("</blockquote>");
}
}
}
vez=true;
hallarUltGen(paco);
e("<p><p>"+dev.length+" ultimos en generacion.")
</script>
Me voy a explicar un poco porque el código es bastante txungo:
Opers es la function para definir los objetos persona, con propiedad nom (nombre) e hijos (array con los objetos Opers del padre). Bueno en esta tontería solo hay un padre, pero bueno, se puede comprender.
hallarUltGen(de) mete en el array llamado dev los objetos Opers últimos digamos en el árbol genealógico del objeto indicado en el argumento 'de'. Se apoya en 'vez' que unicamente define cuándo se llama por primera vez (es recursiva, más que nada para inicializar dev).
La function e(t) es simplemente para ahorrarme escribir.
La cosa es que no funciona, se producen cambios raros. Algunas lineas cuando se crea el objeto Opers("paco") y sus hijos están comentadas. Obsérvese cuando se quitan los comentarios. Se produce un bucle infinito y no se porqué. Ademas si por ejemplo solo le ponemos a paco dos hijos(paco_0, paco_1), y al primero de éstos se le añade uno(paco_0_0), entonces no se muestra el segundo hijo de paco (paco_1), ni se añade a dev, como si se lo olvidase.
Sin duda alguna un reto para mi y para muchos programadores. Cuando lo finalice me gustaría pasarlo a C++, pero eso corre por mi cuenta je je.
<script>
function Opers(nom) { //clase persona
this.nom=nom;
this.hijos=new Array();
}
function e(t) { document.write(t); }
paco=new Opers("paco");
Nhijo(paco); //paco_0
Nhijo(paco.hijos[0]);
Nhijo(paco); //paco_1
Nhijo(paco.hijos[1]);
Nhijo(paco); //paco_2
//Nhijo(paco.hijos[2]);
//Nhijo(paco) //paco_3
//Nhijo(paco) //paco_4
vez=true;
function hallarUltGen(de) {
e("<p>Trabajamos con <b>"+de.nom+"</b>:<br>");
if(vez) { //la primera vez que se ejecuta.
dev=new Array();
e("Empezando:<br>")
vez=false;
}
if(de.hijos.length==0) { //si no tiene hijos, el es el ultimo. Terminar funct
dev[dev.length]=de;
e("No tiene hijos, añadido a dev.<br>");
}
else{ //si tiene ijos
e("Tiene hijos, "+de.hijos.length+":<br>");
for(a=0;a<de.hijos.length;a++) { //por cada hijo hallar ultGen y terminar la function
e("Llama a la function hallarUltGen con <b>"+de.hijos[a].nom+"</b>:<br><blockquote>")
hallarUltGen(de.hijos[a]);
e("</blockquote>");
}
}
}
vez=true;
hallarUltGen(paco);
e("<p><p>"+dev.length+" ultimos en generacion.")
</script>
Me voy a explicar un poco porque el código es bastante txungo:
Opers es la function para definir los objetos persona, con propiedad nom (nombre) e hijos (array con los objetos Opers del padre). Bueno en esta tontería solo hay un padre, pero bueno, se puede comprender.
hallarUltGen(de) mete en el array llamado dev los objetos Opers últimos digamos en el árbol genealógico del objeto indicado en el argumento 'de'. Se apoya en 'vez' que unicamente define cuándo se llama por primera vez (es recursiva, más que nada para inicializar dev).
La function e(t) es simplemente para ahorrarme escribir.
La cosa es que no funciona, se producen cambios raros. Algunas lineas cuando se crea el objeto Opers("paco") y sus hijos están comentadas. Obsérvese cuando se quitan los comentarios. Se produce un bucle infinito y no se porqué. Ademas si por ejemplo solo le ponemos a paco dos hijos(paco_0, paco_1), y al primero de éstos se le añade uno(paco_0_0), entonces no se muestra el segundo hijo de paco (paco_1), ni se añade a dev, como si se lo olvidase.
Sin duda alguna un reto para mi y para muchos programadores. Cuando lo finalice me gustaría pasarlo a C++, pero eso corre por mi cuenta je je.
1 Respuesta
Respuesta de evalenzuela
-1