Comunidad de diseño web y desarrollo en internet online

recurrencia en action script

Citar            
MensajeEscrito el 09 Abr 2007 12:55 pm
hola a tod@s, tengo este problema y es que no se como enfocar la recurrencia de esta funcion:

Código :

//esta variable el numero de menus que hay en la web
n=2;
//esta varible nos dira el menu seleccionado que se actualiza cada vez que clickeo un elemento
//de menu
menusel=0;


function rotar_menus(posX,posY)
{
   //este if nos rota y nos posiciona el menu principal que se ha seleccionado
   //cuando se clickea sobre el
   if (_root.menusel!=0)
   {
      num_menu=_root.menusel;
      //esto es para rotar y posicionar el boton del menu
      if(_root["menu"+num_menu]._rotation>-90)
      {
         _root["menu"+num_menu]._rotation-=9;
         //esto es para escalar y reposicionar los botones de menu, 
         //el titulo y el fondo del titulo
         _root["menu"+num_menu]._xscale -=4;
         _root["menu"+num_menu]._yscale -=4;
         _root.titulo._xscale -=4;
         _root.titulo._yscale -=4;
         _root.titulo._y+=9;
         _root.fondo_titulo._xscale-=13;
      }
      if(_root["menu"+num_menu]._x>posX)
         _root["menu"+num_menu]._x-=24;
      if(_root["menu"+num_menu]._y<posY)
         _root["menu"+num_menu]._y += 10;
   }
   //este bucle nos rota y nos posiciona los otros menus no seleccionados
        //y es aqui donde me falla el tema de la recurrencia porque se convierte en un bucle        
        //infinito...lo deberia de hacer con una variable de control? eso me funcionaria para solo 
        //dos menus, pero para mas ya no funcionaria...estoy un poco atascadillo
   iniY=380;
   for (i=1;i<n+1;i++)
   {
      //si el menu que vamos a rotar no es el que ya hemos rotado con el primer 
      //if codificamos que nos lo mueva, si no, que no haga nada
      if (i!=num_menu)
      {
         rotar_menus(35,iniY);
         iniY+=_root["menu"+i]._height;
      }
   }
}


gracias a tod@s de antemano
un saludo
atentamente
maije

Por maije

Claber

104 de clabLevel



Genero:Masculino  

Valladolid

firefox
Citar            
MensajeEscrito el 09 Abr 2007 04:35 pm
NO PUEDES INVOCAR UNA FUNCION DENTRO DE SI MISMA como tienes en tu código:
rotar_menus(35,iniY);
dentro de la funcion rotar_menus(); se convierte en infinito. Si quieres hacer una recurrencia de una animación que hace chico y grande algo hay mil maneras de hacerlo, ya sea con la clase tween o con setInterval, animando, con un prototipo, etc. investiga sobre eso y nos cuentas como te fue. ^^, yo te recomiendo que uses la clase tween

PD: Puedes cambiar esto:

Código :

for (i=1; i<n+1; i++) {

por esto

Código :

for (i=1; i<=n; i++) {

Por bryanisimo

664 de clabLevel



Genero:Masculino  

Geek

firefox
Citar            
MensajeEscrito el 09 Abr 2007 06:48 pm
ok, muchas gracias de nuevo bryanisimo, ya van dos ayudas ;)
en cuanto a lo de la recurrencia, lo solucione haciendo un array de n-1 componentes donde n era el numero de menus que habia y cada vez que entraba en la recurrencia, comprobaba si todos los elementos del array estaban puestos a 0 o a 1 y si habia algun elemento puesto a 0, pues entraba de nuevo en el if con la llamada a la funcion. quizas me este equivocando con el nombre, pero si que se puede llamar a una funcion dentro de si misma y a eso creo que se le llama funcion recurrente, pero hay que tener cuidado con la condicion, porque puede desembocar en un bucle infinito. es el caso tipico para encontrar todos los divisores de un numero o cosas asi de la siguiente forma en pseudocodigo:

Código :

num2 es igual a num
funcion recurrente(num,num2){
si el modulo de num dividido entre num2 es 0 y num2 es mayor que 1 hacer :
{
         array en su componente 1 almacena num2
         num2 disminuye en 1
         llamamos de nuevo a al funcion: recurrente(num,num2)
}
devolvemos array fuera de la funcion
}


asi tendriamos una funcion con unas pocas lineas que nos guarda en un array todos los divisores de num de mayor a menor.

NOTA: puede que el codigo no funcione asi, es solo por poner un ejemplo y me lo he inventado sobre la marcha...hay ejemplos mucho mas claros por ahi :)

eso facilita muchisimas operaciones matematicas y ahorra mucho codigo haciendo que este sea mas elegante y "fardon" delante de tus amigos :D:D:D

piensatelo y no dudes en usar la recurrencia (me parece recordar que se llamaba asi), es muy util.

en cuanto a las condiciones del for, es una costumbre que tengo nunca usar el = dentro de la condicion...ya sabes, manias programadoras...

muchas gracias de nuevo
un saludo
atentamente
maije

Por maije

Claber

104 de clabLevel



Genero:Masculino  

Valladolid

firefox
Citar            
MensajeEscrito el 09 Abr 2007 09:28 pm
que no eso aplica para variables? por ejemplo:

Código :

a=a+2

Quien sabe, eso de teoría no es lo mio :P saludos

Por bryanisimo

664 de clabLevel



Genero:Masculino  

Geek

firefox
Citar            
MensajeEscrito el 10 Abr 2007 09:16 am
buenos dias bryanisimo. no entiendo muy bien tu pregunta, si pudieras explicarla un poco mas espero poder responderla. en cuanto a lo de la "recurrencia", recorde que no era ese su nombre...era recursividad...vaya memoria...y ahora si que podras encontrar cosas interesantes por el google si quieres :D. me parece que en programacion es el bucle mas "complejo"...porque al fin y al cabo es un bucle como otro cualquiera, con unas instrucciones y una condicion de permanencia y/o cumplimiento. solo que hay que tener muuucho mas cuidado con donde pones las instrucciones y en que orden :)

por si acaso con tu pregunta te refieres a que si podrias hacer algo como por ejemplo

funcion recursiva(var,a){
si la variable no ha alcanzado el valor v1 (if (var < a))
{
a=a+1
recursiva(num,v1)
}
exportar valor de v1
}

....tambien vale :) te dice el numero entero inmediatamente inferior a que tu le has pasado. si no te referias a algo como eso, pregunta de nuevo :D

un saludo ;)
atentamente
maije

Por maije

Claber

104 de clabLevel



Genero:Masculino  

Valladolid

firefox
Citar            
MensajeEscrito el 10 Abr 2007 04:01 pm
oO woooorale que viajado, mi ya entender XD, pero yo usaria un while en ese caso especifico ^^

Código :

function norecursivaPeroMismoResultadoCREO(var,a):Number{
   while(var<a){ a+=1 }
   return a;
}


Bueno, me pondré a invertigar, puede que me sirva ;) saludos y bye

Por bryanisimo

664 de clabLevel



Genero:Masculino  

Geek

firefox
Citar            
MensajeEscrito el 10 Abr 2007 05:55 pm
si, esa funcion hace lo mismo que la recursiva :), pero era unicamente para mostrarte un ejemplo. en la gran mayoria de casos se puede usar indistintamente la recursividad y la codificacion normal sin autollamadas, pero en muchos de ellos, ahorras mucho codigo usando la primera.

ahora quizas no, pero quizas algun dia estes codificando y tengas que hacer algo que te lo pida :D

un saludo
atentamente
maije

Por maije

Claber

104 de clabLevel



Genero:Masculino  

Valladolid

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.