Foros del Web » Programando para Internet » Javascript »

Fibo(1000): códigos y comentarios.

Estas en el tema de Fibo(1000): códigos y comentarios. en el foro de Javascript en Foros del Web. Hola: Llegó el momento de presentar los códigos para resolver el Mini-desafío: Obtener el número 1000 de la serie de Fibonacci . Mi código: Código: ...
  #1 (permalink)  
Antiguo 30/05/2010, 23:04
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Fibo(1000): códigos y comentarios.

Hola:

Llegó el momento de presentar los códigos para resolver el Mini-desafío: Obtener el número 1000 de la serie de Fibonacci.

Mi código:

Código:
function fibo(n)	{
	//s = ["0"];
	f = ["1", "0"];
	c = 0;
	ns = "0123456789";
	for (i = 0; i < n; i++)	{
		r = "";
		for (j = f[0].length - 1; j >= 0; j--)	{
			c += ns.indexOf(f[0].charAt(j)) + ns.indexOf(f[1].charAt(j));
			r = ns.charAt(c % 10) + r;
			c = Math.floor(c / 10);
		}
		if (c == 1)	{
			r = "1" + r;//ns.charAt(c) + r;
			f[i & 1] = r;
			f[(i + 1) & 1] = "0" + f[(i + 1) & 1];
			c = 0;
		}
		else
			f[i & 1] = r;

		//s.push(r);
	}
	return r; //f[(n + 1) & 1];
}
Se puede ver que se trata de sumar el acarreo de cada suma parcial a la suma de cada dígito de cada cadena.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #2 (permalink)  
Antiguo 30/05/2010, 23:14
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Fibo(1000): códigos y comentarios.

¡llego el momento que todos -o al menos yo- hemos estado espeando, el momento de la verdad!
Código:
sum = function(a, b){
if(Math.max(a.length, b.length) <= 14) return String(Number(a) + Number(b));
var serie = "", nth = "", reg = /\d{1,14}$/, pack = [];
while(a || b){
a = a.replace(reg, function(m){ pack.push(m); return "";});
b = b.replace(reg, function(m){ pack.push(m); return "";});
var sum = String(Number(pack.shift() || 0) + Number(pack.shift() || 0) + Number(nth));
while(sum.length < 14)sum = "0" + sum;
if(sum.length > 14){
nth = sum.substring(0,1);
sum = sum.replace(/^\d/, "");
}else nth = "";
serie = sum + serie;
}
return (nth + serie).replace(/^0*/, "");
}

fib = function(n){
if(!m.hasOwnProperty(n)) m[n] = sum(arguments.callee(n - 1), arguments.callee(n - 2));
return m[n];
}
m = {0:"0", 1:"1"};
cabe mencionar que tengo tres versiones relativamente distintas. cada una fue un intento de reducir el tiempo de respuesta y aumentar la eficiencia. esta que presento es la tercera version. en esta solucion me base en empaquetamiento de cifras manejable por javascript sin perder precision.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #3 (permalink)  
Antiguo 31/05/2010, 16:23
Avatar de Triby
Mod on free time
 
Fecha de Ingreso: agosto-2008
Ubicación: $MX->Gto['León'];
Mensajes: 10.106
Antigüedad: 15 años, 8 meses
Puntos: 2237
Respuesta: Fibo(1000): códigos y comentarios.

Excelente!!! yo que no se mucho de javascript voy a tener que estudiar un poco (un mucho ) lo que hicieron para tratar de entenderlo y, aunque pareciera que tiene poca aplicacion en el "mundo real", seguramente a mas de uno le servira para solucionar algun problema con operaciones matematicas.

P.D. Triby debe ser como Dalai-Lama (esparcir mas karma) antes de hacer lo propio con quienes ya publicaron solucion.
__________________
- León, Guanajuato
- GV-Foto
  #4 (permalink)  
Antiguo 31/05/2010, 16:54
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Fibo(1000): códigos y comentarios.

Cita:
aunque pareciera que tiene poca aplicacion en el "mundo real"
sabes triby, quizas tengas razon. pero algo que se puede aprender, y aplicable para el mundo real, son las tecnicas y algoritmos para resolver problemas. admito que considerablemente me llama la atencion el algoritmo de caricatos. anoche pase unos largos minutos tratando de entenderlo pero no pude. claro, no porque no tenga la capacidad, es que anoche llegue super cansado a casa que ni podia concentrarme bien. hoy tampoco me dare la tarea porque hoy fue otro dia casi igual que ayer...

por cierto, compare el tiempo de respuesta de la solucion de caricatos para la posicion mil y tiene mas o menos el mismo tiempo que mi solucion. sin embargo, me asombro mucho que con su solucion, solo toma alrededor de 20 segundos para la posicion diez mil. ¡bien hecho caricatos! supongo que la clave estuvo en el bucle y no basarlo en recursion de funciones.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #5 (permalink)  
Antiguo 31/05/2010, 17:32
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Fibo(1000): códigos y comentarios.

Hola:

Mientras el "perdido" de Nahuel2k10, descubre este tema y nos muestra el código (supongo que ya lo hemos visto en su blog), creo que podemos comentar los códigos... la verdad es que el de ZK voy a tardar más en comprenderlo, porque usa unas primitivas que sinceramente no conozco ...

Sobre mi código no es otra cosa que una suma letra a letra de los 2 números guardados como cadenas, empezando por el último (length - 1) hasta el primero 0, y entre las pequeñeces que pudieran ayudar a ser rápido (supongo que no es para tanto), es que para seleccionar entre el elemento par e impar, tan solo se chequea el bit de paridad (creo que lo sugirió razpeitia en el tema de Python), y cuando existe acarreo en vez de calcular, se añade un "1" y en el otro elemento del array un "0"; al ser constantes, se mejora tal vez un poco...

Como continuación, y siguiendo con números largos y algoritmos recursivos, se me ocurre calcular el factorial de otro número grande (tal vez el 1000), que también es infinito... aunque 100! ya es un número grande, pero se obtiene con multiplicaciones y no con sumas...

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #6 (permalink)  
Antiguo 31/05/2010, 21:50
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: Fibo(1000): códigos y comentarios.

Corillo, no pude publicar mi código hoy, ya que lo deje en el trabajo, se lo comió el perro. Voy a ver si la consigo, aunque sea a trozos . Voy a ver los códigos de ambos y les dejo saber. El caso mio yo fui por el camino que dijo Panino que es impreciso.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 01/06/2010, 01:09
Avatar de Nahuel2k10  
Fecha de Ingreso: abril-2010
Mensajes: 37
Antigüedad: 14 años
Puntos: 3
Respuesta: Fibo(1000): códigos y comentarios.

Ey bueno.. esta trade en mi casa probaré los códigos, la verdad que solo estaba siguiendo el otro hilo y sí, me perdí, tampoco leí que iban a abrir un nuevo hilo para las respuestas. En fin, el mío creo que busqué la solución fácil, me gustaría que alguien evaluara los tiempos de todos los códigos. Saludos a todos y ya os comento esta tarde!
  #8 (permalink)  
Antiguo 01/06/2010, 02:34
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Fibo(1000): códigos y comentarios.

Hola:

Entonces, solo falta pegar aquí un par de códigos... o hay más de última hora.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #9 (permalink)  
Antiguo 01/06/2010, 14:34
Avatar de Panino5001
Me alejo de Omelas
 
Fecha de Ingreso: mayo-2004
Ubicación: -34.637167,-58.462984
Mensajes: 5.148
Antigüedad: 19 años, 10 meses
Puntos: 834
Respuesta: Fibo(1000): códigos y comentarios.

Felicitaciones a ambos! Muy buenos códigos. Particularmente me parece más limpio el de caricatos y es el que más me gusta. El de zerokilled me parece muy bueno, pero utiliza un recurso que debe evitarse y está desaconsejado (y supuestamente obsoleto en futuras versiones de javascript): arguments.callee.
Pero de nuevo felicitaciones a ambos y esperemos que sigan prosperando este tipo de actividades en el foro de javascript.
  #10 (permalink)  
Antiguo 02/06/2010, 00:17
Avatar de Nahuel2k10  
Fecha de Ingreso: abril-2010
Mensajes: 37
Antigüedad: 14 años
Puntos: 3
Respuesta: Fibo(1000): códigos y comentarios.

Código Javascript:
Ver original
  1. function fib(x){
  2. var a = "0";
  3. var b = "1";
  4. var c = "0";
  5. for (k=x;k>2;k--){
  6.     c=a;
  7.     a=b;
  8.     b=suma(b,c);
  9. }
  10.     return suma(a,b);
  11. }
  12. function suma(a,b){
  13.     var sumado = "";
  14.     var num=0;
  15.     if(b.length>a.length) {
  16.         var c=a;
  17.         var a=b;
  18.         var b=c;
  19.     }
  20.     c="0"
  21.     for(i=0; i<b.length ; i++){
  22.         var num =eval(a.substring(a.length-1-i,a.length-i))+eval(b.substring(b.length-1-i,b.length-i))+eval(c);
  23.         if(num>9){
  24.             c="1";
  25.             num=num-10;
  26.         }else{
  27.             c="0";
  28.         }
  29.         sumado=num.toString().concat(sumado);
  30.     }
  31.     i=b.length;
  32.     while(i<a.length){
  33.         if(c == "0"){
  34.             num=eval(a.substring(a.length-1-i,a.length-i));
  35.         }else{
  36.             num=eval(a.substring(a.length-1-i,a.length-i))+1;
  37.         }
  38.         if(num>9){
  39.             num=num-10;
  40.         }else{
  41.             c="0";
  42.         }
  43.         sumado=num.toString().concat(sumado);
  44.         i++;
  45.     }
  46.     if(c =="1"){
  47.         sumado=c.concat(sumado);
  48.     }
  49.     return sumado;
  50. }

Bueno el mío a lo mejor es un poco menos efectivo que el vuestro.. pero bueno el resultado devuelto es válido. Saludoss
  #11 (permalink)  
Antiguo 05/06/2010, 19:24
Avatar de arthpix  
Fecha de Ingreso: diciembre-2003
Ubicación: Cancún
Mensajes: 2.340
Antigüedad: 20 años, 4 meses
Puntos: 93
Respuesta: Fibo(1000): códigos y comentarios.

ufff!! felicidades a los 3, caricatos, zerokilled y Nahuel2k10. 3 maestros de javascript.

Creo que yo al igual que Triby tengo muucho que estudiar. Solo que yo tendría que empezar por estudiar matemáticas
__________________
Antes de hacer rabietas infórmate: Linux != Windows
  #12 (permalink)  
Antiguo 06/06/2010, 00:59
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Fibo(1000): códigos y comentarios.

Hola:

Estuve ausente un par de días, y muy poco se ha comentado desde entonces... creo que los autores podrían explicar los códigos expuestos.

Sobre el código de Nahuel2k10, empecemos a ser "criticones", veo que el planteamiento es similar al mío, aunque lo que no me gusta es el uso de "eval", y el substring, al tratar solo una letra, hubiera sido mejor implementar el código con charAt... bueno, por lo visto, se diferencia del mío por eso y en mi caso cambio el eval por "0123456789".indexOf(ese_char)

Qué pena que no haya más códigos... también sería interesante comentar códigos fallidos. Por mi parte, pensé en un array de números entre 0 y 1, haciendo un .push(1) con los acarreos y mostrar ese array.join(""); pero me dió tantos fallos que terminé dejándolo.

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #13 (permalink)  
Antiguo 07/06/2010, 03:58
Avatar de dggluz  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 525
Antigüedad: 15 años
Puntos: 50
Respuesta: Fibo(1000): códigos y comentarios.

Disculpen por "arruinarles" este divertido desafío, pero me encontré teniendo que ingeniármelas para entender los códigos que posteaban. Me resultó interesantísimo cuando entendí (al menos en parte) qué es lo que hacían. Decidí entonces facilitarles la tarea a los demás navegantes y explicar una solución, para que no tengan que romperse la cabeza (o que sí lo hagan, pero que no se frustren si no lo entienden).
El código que me quedó calcula bien y rápidamente fibo(1000).

ADVERTENCIA: si quieres resolver el desafío completamente por tu cuenta, no sigas leyendo mi comentario.

Gracias a la comunidad de ForosDelWeb en general por las magníficas ideas aportadas.
Si no sabes qué es la Serie de Fibonacci, primero dedícate a averiguar qué es y luego sigue leyendo el post.

Explicación: la serie de Fibonacci, traducida literalmente de la matemática a la computación resulta una función recursiva como la siguiente:

Código Javascript:
Ver original
  1. function fibonacci(n)
  2. {
  3.     if(n==0)
  4.     {
  5.         return 0;
  6.     }
  7.     if(n<=2)
  8.     {
  9.         return 1;
  10.     }
  11.     return fibonacci(n-1)+fibonacci(n-2);
  12. }

El problema con esa solución es que la computadora hace mucho más proceso que el necesario. Y eso no es sólo porque evaluar recursivamente una función requiera más procesamiento que dentro de un bucle, sino porque sencillamente se calcula de más:
Cada vez que se requiere calcular un fibonacci(n) con n>2, deben calcularse dos números de fibonacci y así recursivamente; pero se calculan muchas veces los mismos números. Veamos un ejemplo:
fibonacci(6):
- Debe calcular fibonacci(5) y fibonacci(4).
fibonacci(5):
- Debe calcular fibonacci(4) y fibonacci(3).
fibonacci(4):
- Debe calcular fibonacci(3) y fibonacci(2).
fibonacci(3):
- Debe calcular fibonacci(2) y fibonacci(1).
fibonacci(2) y fibonacci(1):
- Es 1 (f(0)=0, f(1)=1, f(2)=1)

¿Me siguieron? Para calcular el fibonacci(6) hay que calcular una vez el fibonacci(5), 2 veces el fibonacci(4), 3 veces el fibonacci(3), 5 veces el fibonacci(2) y 3 veces el fibonacci(1) ¡14 cálculos! (más la suma final: ¡15!). Si no me creen háganse una prueba de escritorio con lápiz y papel... les quedará un lindo arbolito.

Obviamente el fibonacci(k) siendo k constante siempre será el mismo, por lo cual calcularlo más de una vez es innecesario. Y lo peor es que la situación empera drásticamente al tener que calcular fibonacci(1000). Hay algunas soluciones computacionales a esto, como memoization.
Pero el problema se evita pensando el cálculo desde otra perspectiva: sólo se necesitan dos variables (más una auxiliar) para calcular cualquier número de fibonacci, siendo que estas variables contienen una el fibonacci(n-1) y la otra el fibonacci(n-2), pero sin necesidad de llamar a la función recursivamente para calcularlos, sino calculándolos a partir de fibonacci(1) y fibonacci(2) y guardando siempre los resultados parciales en estas mismas variables (esta idea la tomé de la solución de Caricatos en este post):

Código Javascript:
Ver original
  1. function fiboN(n)
  2. {
  3.     var f1=1;
  4.     var f2=1;
  5.     var aux;
  6.     for(var i=n; i>2; i--)
  7.     {
  8.         aux=f1;
  9.         f1+=f2;
  10.         f2=aux;
  11.     }
  12.     return f1;
  13. }

Esta solución es sensiblemente más veloz (muchísimo más veloz de hecho, sólo calcula n-2 veces para fibonacci(n)) que la anterior. Pero tiene un problema: Javascript (así como la gran mayoría de lenguajes de programación, una buena excepción es Python) no tiene cálculos aritméticos exactos cuando se trata de números muy grandes (o muy pequeños), sino que usan para almacenarlos en memoria una notación exponencial, que si bien es muy eficiente, es inexacta. Por eso, cuando se intentan calcular fibonacci's grandes, los números empiezan a dar resultados erróneos. La solución que encontré a esto es almacenar los números como cadenas de caracteres. Para ello es necesario definir una suma de cadenas de caracteres como si de números se tratara (el algoritmo que uno utiliza cuando suma "a mano", con arrastre y todo), de modo que la computadora nunca tenga que manejar números grandes (de hecho, nunca mayores a 20). Entonces sí, el código final (muuuuuuuy similar al de Nahuel2k10):

Código Javascript:
Ver original
  1. function fibo(n)
  2. {
  3.     var f1='1';
  4.     var f2='1';
  5.     var aux;
  6.     for(var i=n; i>2; i--)
  7.     {
  8.         aux=f1;
  9.         f1=sumar(f1,f2);
  10.         f2=aux;
  11.     }
  12.     return f1;
  13. }
  14.  
  15. function sumar(a,b)
  16. {
  17.     // Siempre a es mayor o igual que b      %
  18.     var arrastre=false;
  19.     var ret='';
  20.     var suma;
  21.     var dif=a.length-b.length;
  22.     for(var i=a.length-1; i>=0; i--)
  23.     {
  24.         suma=arrastre?1:0;
  25.         suma+=parseInt(a.charAt(i))+parseInt(((i-dif)>=0)?b.charAt(i-dif):'0');
  26.         if(suma>=10)
  27.         {
  28.             arrastre=true;
  29.             suma=suma%10;
  30.         }
  31.         else
  32.         {
  33.             arrastre=false;
  34.         }
  35.         ret=suma+ret;
  36.     }
  37.     if(arrastre)
  38.     {
  39.         ret='1'+ret;
  40.     }
  41.     return ret;
  42. }

¡Suerte!

Última edición por dggluz; 07/06/2010 a las 09:03
  #14 (permalink)  
Antiguo 07/06/2010, 11:13
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Fibo(1000): códigos y comentarios.

Hola:

dggluz: También me gusta el código, lástima que no te hayas "manifestado" antes (tengo que ser un poco malillo) de que se mostraran los códigos, pero sin dudas, un código limpio y sencillo, mi enhorabuena, pero estás fuera de concurso para ganar el ipad ( ¡Je, je!)... lo del ipad es otra broma, aunque en el futuro no se descartan premios en estos concursos... (tiren papelitos, muchachos)

Por cierto, ya puestos a explicar la parte teórica, sólo son dos valores fijos...

fibo(0) = 0;
fibo(1) = 1;
fibo(n) = fibo(n - 1) + fibo(n - 2);
...

Así que tu pseudo-código no es del todo correcto, aunque te has esmerado tanto que no voy a retocar nada

¿ + comentarios?


Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #15 (permalink)  
Antiguo 07/06/2010, 11:41
Avatar de dggluz  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 525
Antigüedad: 15 años
Puntos: 50
Respuesta: Fibo(1000): códigos y comentarios.

Sí, son dos valores... pero se ahorra una recursión más si se devuelven tres (¡qué argumento tan malo, jaja!).
No me enteré a tiempo porque anduve ocupado y alejado del foro por un tiempo. ¡Suerte!

PD: estoy ansioso de participar en el próximo desafío.
  #16 (permalink)  
Antiguo 07/06/2010, 18:16
Avatar de rebouy  
Fecha de Ingreso: mayo-2010
Ubicación: Argentina
Mensajes: 21
Antigüedad: 13 años, 10 meses
Puntos: 0
Respuesta: Fibo(1000): códigos y comentarios.

Hola a todos, la verdad estoy pendiente de este tema desde el momento en que el señor caricatos publico su codigo.
Mis conocimientos de programacion son muy bajos(pero me gusta investigar y aprender) y de matematicas tambien pero la secuencia de fibonacci es simple de entender.
En fin, felicitaciones a todos por sus codigos y espero mas mini-desafios aunque sea para mirar y admirar y no participar.
PD:Tengo mi precaria cavernicola fibo(1000) pero por pudor me abstengo de presentarla ,
igualmente el resultado es parecido(con eso me alegro)=4.346655768693743e+208.
Saludos a todos!.
  #17 (permalink)  
Antiguo 07/06/2010, 18:20
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Fibo(1000): códigos y comentarios.

Cita:
Iniciado por dggluz Ver Mensaje
...
PD: estoy ansioso de participar en el próximo desafío.
¡Y yo también!, Ahora solo hace falta una propuesta que convezca (la palabreja se las trae...)

Saludos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo
  #18 (permalink)  
Antiguo 07/06/2010, 18:43
Avatar de dggluz  
Fecha de Ingreso: abril-2009
Ubicación: Buenos Aires, Argentina
Mensajes: 525
Antigüedad: 15 años
Puntos: 50
Respuesta: Fibo(1000): códigos y comentarios.

Caricatos: ábrete un nuevo hilo para discutir cuál será el próximo desafío. Los que se me ocurren:
  • Movimiento de figuras (divs, texto o similar) en 3 dimensiones (generando anaglifos y todo, para las gafas de colores), y que se muevan según una función pasada por parametro (f(x, y, z)).
  • Algún juego sencillo y clásico: pong, tetris, arkanoid, snake, pacman, etc.
  • Un editor WYSIWYG realmente bueno.
  • Un framework original o un plugin original para alguno ya existente.
  • Otros cálculos matemáticos.
¡Suerte!
  #19 (permalink)  
Antiguo 08/06/2010, 07:59
Avatar de _cronos2
Colaborador
 
Fecha de Ingreso: junio-2010
Mensajes: 2.062
Antigüedad: 13 años, 10 meses
Puntos: 310
Respuesta: Fibo(1000): códigos y comentarios.

¿Alguien conoce el problema del mendigo y el avaro?
  #20 (permalink)  
Antiguo 08/06/2010, 13:54
Avatar de stock  
Fecha de Ingreso: junio-2004
Ubicación: Monterrey NL
Mensajes: 2.390
Antigüedad: 19 años, 9 meses
Puntos: 53
Respuesta: Fibo(1000): códigos y comentarios.

Woaw!! me hubiese gustado participar en el desafio, lastima que hasta hoy me entero, seguiré pendiente si sale otro :)
  #21 (permalink)  
Antiguo 12/06/2010, 14:39
Avatar de zerokilled
Javascripter
 
Fecha de Ingreso: abril-2009
Ubicación: Isla del Encanto, La Borinqueña [+>==]
Mensajes: 8.050
Antigüedad: 15 años
Puntos: 1485
Respuesta: Fibo(1000): códigos y comentarios.

Comparando

bueno gente, volviendo al tema ya que no lo hice antes por vagancia. me he fijado que -o asi lo aparenta- cada uno de los que participamos enfocamos la solucion mas o menos de la misma forma, y estoy casi seguro que mas de uno de los que intentaron participar pensaron la solucion de la misma forma. claro, mi codigo no se parece mucho a los expuestos por caricatos y nahuel. pero como ya habia comentado, no era el unico codigo que habia intentado. a continuacion la primera solucion que se me habia cruzado. no parece tan obvio pero si lo analizan veran que la computacion se realiza digito por digito.
Código:
m = {0:"0", 1:"1"};
fib = function(n){
if(!m.hasOwnProperty(n)) m[n] = sum(fib(n - 1), fib(n - 2));
return m[n];
}

sum = function(a, b){
function n(d){
return isNaN(d)? 0: Number(d);
}
a = a.replace(/^0*/, "").split('').reverse();
b = b.replace(/^0*/, "").split('').reverse();
var length = Math.max(a.length, b.length);
for(var i = 0, tenth = 0, result = ""; i < length; i++){
var sum = (n(a[i]) + n(b[i]) + Number(tenth)).toString().match(/(\d*)(\d)/);
result = sum[2] + result;
tenth = sum[1];
}
return tenth + result;
}

Comentario

del codigo de nahuel2k digo casi lo mismo que caricatos. lo que no me agrada es el uso excesivo de eval. mi desagrado no es tanto porque eval sea evil, sino porque eval es lento en procesar aparte de que casi siempre existe una forma alternativa para realizar lo mismo sin necesidad de eval.
__________________
la maldad es una virtud humana,
y la espiritualidad es la lucha del hombre contra su maldad.
  #22 (permalink)  
Antiguo 21/06/2010, 15:25
Avatar de Nahuel2k10  
Fecha de Ingreso: abril-2010
Mensajes: 37
Antigüedad: 14 años
Puntos: 3
Respuesta: Fibo(1000): códigos y comentarios.

Hola, la verdad que estuve un poco perdido con todo este tema. Volviendo un poco al mismo, me sirvio para probrar un poco javascript ya que apenas lo había tocado. Y gracias por todas las críticas que ayudan a aprender y a mejorar. Vuestros códigos me han parecido muy interesantes. Saludoss! y siento mi retraso a la hora de comentar.
__________________
Mi blog personal
  #23 (permalink)  
Antiguo 23/06/2010, 03:47
Avatar de caricatos
Moderador
 
Fecha de Ingreso: abril-2002
Ubicación: Torremolinos (Málaga)
Mensajes: 19.607
Antigüedad: 22 años
Puntos: 1284
Respuesta: Fibo(1000): códigos y comentarios.

Hola:

Vamos a dar por terminado el desafío, y liberar el espacio "importante" para que el tema se caiga por su peso; aunque se puede encontrar las referencias en un tema que acabo de abrir en el grupo social Javascripteros.

Un agradecimiento especial a todos los que han participado tanto aportando códigos, como comentando.

Un abrazo a todos
__________________
Por favor:
No hagan preguntas de temas de foros en mensajes privados... no las respondo

Etiquetas: desafío, fibonacci, genios_javascript, reto
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

SíEste tema le ha gustado a 4 personas




La zona horaria es GMT -6. Ahora son las 14:37.