Private Function Fibonacci(ByVal n As Long) As Long
Dim n1 As Long
Dim n2 As Long
Dim i As Long
If n > 0 Then
If n <= 2 Then
Fibonacci = 1
Else
n1 = 1
n2 = 1
For i = 3 To n - 1
If i And 1 Then
n1 = n1 + n2
Else
n2 = n1 + n2
End If
Next i
Fibonacci = n1 + n2
End If
End If
End Function
// Renvoie le énième terme de la suite de Fibonacci
private static long Fibonnaci(int term)
{
long n1 = 1;
long n2 = 1;
if (term > 0)
{
if (term <= 2) return 1;
else
{
for (int i = 3; i < term; i++)
{
if ((i & 1) == 0) n1 += n2;
else n2 += n1;
}
return n1 + n2;
}
}
return -1;
}
function Fibbonacci(level)
{
if(level)
{
var n1=1;
var n2=1;
var n3=0;
var tab=[1,1]
for(i=0;i<level;i++)
{
n3=n1+n2;
n1=n2;
n2=n3;
tab.push(n3)
}
this.array=tab
this.number=tab*Math.pow(10,-(tab.length-1));
}
else
{
return false;
this.number=null;
this.array=null;
}
}
var suite_de_fibbonacci=new Fibbonacci(18);
var tableau_de_valeur=suite_de_fibbonacci.array;
var nombre_de_fibbonnacci=suite_de_fibbonnaci.number;
Remarque :
S'utilise avec new Fibbonacci(level)
et contient les propriétés number et array, array étant un tableau contenant la suite et number un nombre décimal;
la variable level indique le nombre d'itération de la suite exemple :
1.1235813 = 1+1+2+3+5+8 donc 6 itérations (level 6)
(* Récursive terminale. Exemple d'utilisation : fibonacci 10 donne 55 *)
let fibonacci = function
| n when n <= 2 -> 1
| n -> let rec loop (x, y) = function
| i when i = n -> x + y
| i when i land 1 = 1 -> loop (x + y, y) (i + 1)
| i -> loop (x, x + y) (i + 1)
in loop (1, 1) 3
#include <iostream>
template <int N> inline int fibo(){
return fibo<N-1>()+fibo<N-2>();
};
template <> inline int fibo<1>(){
return 1;
};
template <> inline int fibo<0>(){
return 1;
};
int main(){
//inconvéniant : la récurence exige qu'on le fasse de 500 en 500, sinon, G++ n'aime pas...
int a=fibo<4>();
std::cout << a << "\n";
return 0;
}
Remarque :
j'ai decide d'utiliser les templates car c'est selon moi le seul avantage du Cpp pour ce genre de code, alors si on propose plusieurs langages, autant proposer des codes differents (j'aurais pu pousser a faire des templates sur tout type de donnees, et pas seulement des int, mais bon, pour calculer pi ok, mais pour ca... je ne vois pas trop l'interet)
#include <stdio.h>
unsigned long fib(unsigned long n)
{
return (n < 2) ? 1 : fib(n-2) + fib(n-1);
}
int main()
{
int n=30;
printf("fib(%ld)=%ld\n", n, fib(n));
return 0;
}
use strict;
sub Fib
{
my ($n) = @_;
return 1 if $n < 2;
return Fib($n - 2) + Fib($n - 1);
}
my $n = 30;
printf "Fib(%.0f)=%.0f\n",$n, Fib($n),;
<?php
function fib($n){
if($n < 2) { return 1; }
else { return fib($n - 2) + fib($n - 1); }
}
$n = 30;
printf("Fib(%.0f)=%.0f\n", $n, fib($n));
?>
#!/usr/env/python
def Fib(n):
if n < 2: return 1
return Fib(n-2) + Fib(n-1)
n = 30
print "Fib(%.0f)=%.0f" % (n, Fib(n))
public class fibo {
public static void main(String args[]) {
int N = 30; //Integer.parseInt(args[0]);
System.out.println("fib("+ N + ")=" + fib(N));
}
public static int fib(int n) {
if (n < 2) return(1);
return ( fib(n-2) + fib(n-1) );
}
}
#include <stdio.h>
#include <math.h>
double fib(unsigned long n)
{
// On va s'aide du nombre d'or
return floor(pow((1 + sqrt(5)) / 2, (double)n) / sqrt(5)); // on arrondi
}
int main(void)
{
double r = fib(71);
printf("%lf\n", r);
return 0;
}
Remarque :
Il n'y a pas de risque d'exploser la pile (par récursivité à 50 la pile explose) et c'est sans doute la méthode la plus rapide et la plus précise.
long Fibonacci(long Rank)
{
long n1,n2;
if (Rank==0)
return 0;
if (Rank<=2)
return 1;
Rank-=3;
n2 = 1;
if (Rank & 1) {
n1 = 2;
Rank--;
}
do {
n2 = n1 + n2;
n1 = n1 + n2;
} while(Rank-=2)
return n1+n2;
}
Remarque :
Pas besoin de calcul approximatif ni de récursivité, surtout..
simple et efficace