Autor Tema: Serie de Fibonacci.

0 Usuarios y 1 Visitante están viendo este tema.

03 Diciembre, 2015, 12:52 am
Leído 934 veces

Tachikomaia

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 208
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
El siguiente número es la suma de los dos anteriores, comenzando por 1 y 1.

Si quisiera programar esto, usaría al menos 2 variables, el número anterior y el más reciente.

¿Hay alguna forma de hacerlo sólo mediante 1 variable? Un cálculo sería necesario. La duda, dicho de otro modo, es si hay una relación entre el nro (en el sentido de un eje de X) y su valor, algo así:
nro del nro o valor____valor
1__________________1
2__________________1
3__________________2
4__________________3
5__________________5
6__________________8
Los 2 1eros casos podrían obviarse.

------------------------------------------------------------------------

Ahora, otra cuestión. Supongan que en vez de sumar el último número, fuese sumar los últimos 20, o cualquier cantidad que les parezca mucho. Mi duda en este caso es más o menos similar ¿se puede programar esto usando menos de 20 variables? Tengo cierta idea pero la he estado pensando y como no he podido llegar a mucho ya estoy casi rendido, pero por eso recurriré a uds, me gustaría al menos ver una explicación de por qué es imposible. La idea en cuestión es que en vez de tener 20 variables podría tener la suma de ellas y para calcular el siguiente número le haría *2-X, donde X sería el número que ya no se sumará, el que ha quedado 21 números atrás.
¿Pero se puede calcular X? Parece que es una "solución" que en cierto punto choca con el mismo problema que intenta solucionar...

------------------------------------------------------------------------

Última cuestión, al menos por ahora.

Tengo un programa que obtiene el siguiente número de la serie, y chequea si cumple una condición. Repite este proceso hasta que algún número la cumple.
Tengo otro programa que obtiene la siguiente combinación de letras mayúsculas, así: 1ero "A", luego "B"... "Z", "AA". Chequea a si la combinación cumple una condición. Repite el proceso hasta hallar una que la cumpla.

Quisiera combinarlos. O sea, hacer que en vez de mostrarme "A", "B", "C", "D", etc, es decir lo que sería 1, 2, 3, 4, etc, me mostrara las "letras" que se corresponderían con la serie de Fibonacci: "A", "B", "C", "E"... como ven se ha salteado la D, que sería el 4.
"AA" = 27

Comprendo que el problema pueda, quizá, estar fuera del campo de un matemático, pero no sé, es cuestión de lógica y de trabajar con números, eso es lo que hace un matemático. Creo que está relacionado con esto
https://es.wikipedia.org/wiki/Sistema_hexadecimal
pero en vez de ser 16 dígitos son 27.

Les muestro los códigos de los programas:

Obtiene el siguiente número de la serie, y chequea si cumple una condición. Repite este proceso hasta que algún número la cumple:
Código: [Seleccionar]
// Elementos candidatos: Desde 1 y 1, Suma.
E_Anterior = 1;
E = 1;
// Otros elementos:
Resp = "";

// Análisis:
if (E > 10) {
    Resp = "Un elemento que cumple la condición es el "+E+"\n"+Resp;
    stop ();
}

Resp = "El elemento "+E+" no cumple la condición.\n"+Resp;
E = E_Anterior + E;
E_Anterior = E - E_Anterior;
gotoAndPlay (2);

obtiene la siguiente combinación de letras mayúsculas, así: 1ero "A", luego "B"... "Z", "AA". Chequea a si la combinación cumple una condición. Repite el proceso hasta hallar una que la cumpla.
Código: [Seleccionar]
// Elementos candidatos: Desde A, +1.
E = "A";
// Otros elementos:
Data = "ABCDEFGHIJKLMNÑOPQRSTUVWXYZ";
Char0ID = 0;
CursorMaxPos = 0;

// Anali:
if (E == "OK") {
    Resp = "Un elemento que cumple la condición es el "+E+"\n"+Resp;
    stop ();
}

Resp = "El elemento "+E+" no cumple la condición.\n"+Resp;
Cursor = 0;
E = "";

Resu = "Char"+Cursor+"ID";
EvaledResu = eval(Resu)+1;

if (EvaledResu < 27) {
    set (Resu, EvaledResu);
    // Agrega caracter.
    E = Data.charAt(EvaledResu)+E;
    Cursor = Cursor+1;
    if (Cursor > CursorMaxPos) {
        // Todos agregados.
        gotoAndPlay (2);
    } else {
        // Volverá a agregar.
    }
} else {
    // El char a agregar está fuera del límite.
    set (Resu, 0);
    E = E+Data.charAt(0);
    Cursor = Cursor+1;
    if (Cursor > CursorMaxPos) {
        // Hay que agregar uno.
        CursorMaxPos = CursorMaxPos+1;
        set ("Char"+CursorMaxPos+"ID", 0);
        E = E+Data.charAt(0);
        gotoAndPlay (2);
    } else {
        // Hay que aumentar/agregar uno.
        gotoAndPlay (4);
    }
}

Resu = "Char"+Cursor+"ID";
EvaledResu = eval(Resu);
gotoAndPlay (5);

03 Diciembre, 2015, 01:05 am
Respuesta #1

Juan Pablo Sancho

  • Moderador Global
  • Mensajes: 4,913
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
No sé si es lo que preguntas pero el n-ésimo término de Fibonacci también se puede escribir como:

Toma:

a = ((1+5^(1/2))/2)^(n+1)

b = ((1-5^(1/2))/2)^(n+1)

Entonces:

f_n = (a-b)/5^(1/2)

Donde:

f_1 = 1 y f_2 = 2 sólo es un pequeño cambio.


Sí n es bastante grande puedes poner:

f_n aproximadamente  a/5^(1/2)

03 Diciembre, 2015, 01:24 am
Respuesta #2

Tachikomaia

  • $$\Large \color{red}\pi\,\pi\,\pi\,\pi$$
  • Mensajes: 208
  • País: uy
  • Karma: +0/-0
  • Sexo: Masculino
Corrígeme si me equivoco.

resumen = n+1
r = resumen

Entonces:
a = ((1+5^(1/2))/2)^r
b = ((1-5^(1/2))/2)^r

Pero:
r2 = 5^(1/2)

Entonces:
a = ((1+r2)/2)^r
b = ((1-r2)/2)^r

f_n = (a-b)/5^0.5

Veré si funciona.

¿Habrá alguna fórmula para el caso en que la serie fuese la suma de más de 2 números?
Quizá sea cuestión de variar algunos números en tu fórmula, por ejemplo:
a = ((1+5^(1/3))/3)^(n+1)

b = ((1-5^(1/3))/3)^(n+1)

f_n = (a-b)/5^(1/3)

03 Diciembre, 2015, 01:38 am
Respuesta #3

Juan Pablo Sancho

  • Moderador Global
  • Mensajes: 4,913
  • País: es
  • Karma: +0/-0
  • Sexo: Masculino
Me largo a dormir te pongo esto:

Recurrencia