Sucesión Fibonacci [Batch]

Iniciado por leogtz, 10 Abril 2009, 04:37 AM

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

leogtz

Hola a todos.

Hace tiempo que tenía ganas de hacer esto en Batch.

Para los que no sepan que es la sucesión Fibonacci:
Citar
En matemáticas, la sucesión de Fibonacci es la siguiente sucesión infinita de números naturales:

El primer elemento es 0, el segundo es 1 y cada elemento restante es la suma de los dos anteriores. A cada elemento de esta sucesión se le llama número de Fibonacci. Esta sucesión fue descrita en Europa por Leonardo de Pisa, matemático italiano del siglo XIII también conocido como Fibonacci. Tiene numerosas aplicaciones en ciencias de la computación, matemáticas y teoría de juegos.
De Wikipedia.
Código (dos) [Seleccionar]

@echo off
setlocal enabledelayedexpansion
:code
set /p "numero=Numero : "
if not defined numero (goto:code)
if %numero% lss 1 (
echo.Error, numero negativo.
set /p ,=Pulse Enter para volver.
goto:code
)
for /l %%_ in (1,1,%numero%) do (set "variable%%_=0")
set /a "variable1=1"
set /a "variable2=2"
set /a contador=0
set /a "token_uno=1"
set /a "token_dos=2"
set /a "aumento_de_variable=3"
:bucle
if %contador% equ %numero% (goto:end)
set /a "variable%aumento_de_variable%=!variable%token_uno%! + !variable%token_dos%!"
set /a "token_uno+=1"
set /a "token_dos+=1"
set /a "aumento_de_variable+=1"
set /a "contador+=1"
goto:bucle
:end
for /l %%_ in (1,1,%numero%) do (
echo !variable%%_!
)
set /p =Teclee ENTER para salir.
exit /b 0

Salida :

Numero : 9
1
2
3
5
8
13
21
34
55
Teclee ENTER para salir.


C:\>code
Numero : 5
1
2
3
5
8
Teclee ENTER para salir.


C:\>code
Numero : 25
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
Teclee ENTER para salir.


Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Littlehorse

Por que del 46 en adelante dan numeros negativos?
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

leogtz

Ahora no recuerdo cual es el limite en batch para almacenar.

Pero tampoco no pidas tanto, el termino 46 en la sucesión de fibonacci es demasiado, mira cuanto duró un codigo en C en calcular el 46, con recursión, es más, no pudó calcularlo, por ser un numero demasiado grande:


C:\>timethis fibonacci 46

TimeThis :  Command Line :  fibonacci 46
TimeThis :    Start Time :  Thu Apr 09 20:50:06 2009

1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 17711 28657 46368 75025 12
1393 196418 317811 514229 832040 1346269 2178309 3524578 5702887 9227465 14930352 24157817 390881
69 63245986 102334155 165580141 267914296 433494437 701408733 1134903170 1836311903 -1323752223
TimeThis :  Command Line :  fibonacci 46
TimeThis :    Start Time :  Thu Apr 09 20:50:06 2009
TimeThis :      End Time :  Thu Apr 09 20:52:20 2009
TimeThis :  Elapsed Time :  00:02:14.500

C:\>


Mi codigo en Batch :

C:\>timethis code.bat

TimeThis :  Command Line :  code.bat
TimeThis :    Start Time :  Thu Apr 09 20:54:19 2009

Numero : 46
1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
-1323752223
Teclee ENTER para salir.

TimeThis :  Command Line :  code.bat
TimeThis :    Start Time :  Thu Apr 09 20:54:19 2009
TimeThis :      End Time :  Thu Apr 09 20:54:21 2009
TimeThis :  Elapsed Time :  00:00:01.390

C:\>


Claro que no nos vamos a poner a comparar, solo es para hacer notar que el termino 46 en la sucesión de Fibonacci es muy grande.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Littlehorse

#3
Mira. (Banca que ahi edito)




Yo tampoco me acuerdo cuanto es el limite en batch para almacenar, pero probablemente ese sea el problema, pero vamos en C ya que aparezca el numero negativo es porque lo codeaste sin ganas  ;D
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

leogtz

Cita de: Littlehorse en 10 Abril 2009, 05:08 AM
Mira. (Banca que ahi edito)




Yo tampoco me acuerdo cuanto es el limite en batch para almacenar, pero probablemente ese sea el problema, pero vamos en C ya que aparezca el numero negativo es porque lo codeaste sin ganas  ;D

Jaja, tal ves, es que lo hice con int´s, si lo hubiera hecho con long´s.  :P

Gracias por probar el codigo.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Littlehorse

De nada! Che ese TimeThis lo hiciste vos?
An expert is a man who has made all the mistakes which can be made, in a very narrow field.

leogtz

No, pertenece a el Windows 2000 Resource Kit Tool.
http://www.microsoft.com/downloads/details.aspx?familyid=913795CD-7026-4143-AE85-1F5E096F9BE0&displaylang=en
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com

Littlehorse

An expert is a man who has made all the mistakes which can be made, in a very narrow field.

0x0309

Hey Leo, considerando que solo debes ir sumando los dos números anteriores, podrías crear una función que trate las dos variables como texto, y vaya sumando cada carácter, así te evitas la aparación de números negativos, y podrías alcanzar números muy grandes, considerando que el tamaño máximo de una línea de órdenes es como 4000 u 8000 aprox.

leogtz

Gracias, 0x0309

Un amigo me dijó que no necesitaba tantas variables, que si mucho con 4 se podía hacer, pero ya le expliqué que lo había en Batch y dijó :
"Ah, ok"

Pensó que la hicé en C  :D

Por cierto, recuerdas cual era el limite para almacenar?, hace muchisimo vi que lo posteaste pero lo olvidé.

Saludos.
Código (perl) [Seleccionar]

(( 1 / 0 )) &> /dev/null || {
echo -e "stderrrrrrrrrrrrrrrrrrr";
}

http://leonardogtzr.wordpress.com/
leogutierrezramirez@gmail.com