domingo, 10 de febrero de 2008

La serie de Fibonacci en varios lenguajes de programación

La serie de Fibonacci es una sucesión matemática donde el primer elemento es 0, el segundo es 1 y cada elemento restante es la suma de los dos anteriores, teniendo algo del estilo a:

0,1,1,2,3,5,8,13,21,34,55...

Además, esta serie tiene unas propiedades muy curiosas:

-La razón o cociente entre un término y el inmediatamente anterior varía continuamente, pero se estabiliza en el número áureo.
- Cualquier número natural se puede escribir mediante la suma de un número limitado de términos de la sucesión de Fibonacci, cada uno de ellos distinto a los demás. Por ejemplo, 17 = 13 + 3 + 1, 65 = 55 + 8 + 2.
-Tan sólo un término de cada tres es par, uno de cada cuatro es múltiplo de 3, uno de cada cinco es múltiplo de 5, etc.
-Cada número de Fibonacci es el promedio del término que se encuentra dos posiciones antes y el término que se encuentra una posición después.
-La suma de diez números Fibonacci consecutivos es siempre 11 veces superior al séptimo número de la serie.
-El último dígito de cada número se repite periódicamente cada 60 números.

Incluso, esta serie es "famosa" por haber salido en la novela de Dan Brown "El código Da Vinci" o como los patrones de la batería de la canción Lateralus del grupo Tool. Pero, ¿cual sería el código fuente que necesitaríamos para generar esta serie?. Pues depende del lenguaje, pero sería algo así:

Pascal

uses
crt;
var
cantidad,cont:integer;
function Fibonacci(valor:integer):integer;
begin
if valor = 1 then
fibonacci:= 1;
if valor=0 then
fibonacci:=0;
if valor>=2 then
Fibonacci:=(Fibonacci(valor-1) + Fibonacci(valor-2));
end;

begin
ClrScr;
write('cantidad de valores: ');readln(cantidad);
for cont:=1 to cantidad do
write(fibonacci(cont),', ');
ReadKey;
end.

F#

let rec fib n = if n <>
Ruby

x1,x2 = 0,1; 0.upto(size){puts x1; x1 += x2; x1,x2 = x2,x1}

C#
static int Fibonacci (int x)
{
if (x <= 1) return 1; return Fibonacci (x-1) + Fibonacci (x-2); }
Scala

def fib( n: Int): Int = n match {
case 0 => 0
case 1 => 1
case _ => fib( n -1) + fib( n-2)
}

Erlang

fibo(0) -> 0 ;
fibo(1) -> 1 ;
fibo(N) when N > 0 -> fibo(N-1) + fibo(N-2) .

Perl

#!/usr/bin/perl

my $iterations = 10;

sub f($) {
if ( $_[0] <>
for ( my $i = 0; $i < $iterations; ++$i ) { print f( $i ) . "\n"; }
Ada

with Text_IO, Ada.Integer_Text_IO;
use Text_IO, Ada.Integer_Text_IO;

procedure Fibonacci is
Iterations : constant Natural := 10;
function F( N : Natural ) return Natural is
begin
if N <>
Pl/Sql

variable n number;
exec :n := 15;

with data as (select level le from dual connect by level <= :n) select fibo from data model dimension by (le) measures ( 0 fibo) rules ( fibo[1] = 0 , fibo[2] = 1 , fibo[le>2]=fibo[cv(le)-2]+fibo[cv(le)-1]
)
;

Visual Basic .Net

Dim results As Long()
Function Fibo(ByVal n As Integer) As Long
If n = 0 Then Return 0
If n < 3 Then Return 1

' The array can be of size n - 2 because we don't need slots for the n < 3 case.
ReDim Preserve results(n - 2)
Dim f As Func(Of Integer, Long) = AddressOf Me.calculator

Return calculator(n)
End Function

Function calculator(ByVal x As Integer) As Long
If x = 0 Then
Return 0
ElseIf x < 3 Then
Return 1
Else
Dim index As Integer = x - 3
Dim result As Long = results(index)

If result = 0 Then
result = calculator(x - 1) + calculator(x - 2)
results(index) = result
End If
Return result
End If
End Function

Ensamblador del Z80

Assembly Z-80a

ORG 0100H

LD A,10
PUSH A
CALL FIBO
RET

FIBO:
POP A
OR A
JR NC,FIBO1
DEC A
PUSH A
PUSH A
CALL FIBO
POP A
DEC A
PUSH A
CALL FIBO
RET
FIBO1:
LD A,1
RET


Python

def fibonnaci(n):
#Print Fibonacci sequence up to n
a,b = 0, 1
while b < b =" b,">

Powershell

Function Get-Fib ($n) {
$current = $previous = 1;
while ($current -lt $n) {
$current;
$current,$previous = ($current + $previous),$current}
}
Get-Fib 100


Fuente: Scott Hanselman

7 comentarios:

Anónimo dijo...

Hola bro esta chido tu blog
oye una pregunta por ejemplo como
podria hacer un algoritmo o programa de la serie de fibonacci q cumpla con lo siguiente:
que imprima los primeros "n" terminos de la serie de fibonacci del numero "x"

¿?


me podrias ayudar bro

Unknown dijo...

oye y con visual basic 6.0

Unknown dijo...

lo tendras de casualidad para un microprocesador de intel de la serie ia 32 en lenguaje asembler

itayetzi dijo...

no me lo puedes pasar para pseint

Unknown dijo...

Con simuproc

Unknown dijo...

Con simuproc

Anónimo dijo...

Con simuproc ?