Comment le faire avec bitshift
Si vous souhaitez utiliser bitshift et rendre le code un peu obscure (mais court) que vous pourriez faire:
public uint fibn ( uint N ) {
return N >> 1 != 0? fibn(N-1) + finb(N-2): 1;
}
Pour un entier non signé, N
dans le langage c, N>>1
lance off le bit de poids faible. Si ce résultat est non-nul, il implique que N est supérieur à 1.
Remarque: cet algorithme est horriblement inefficace, inutilement recalcule les valeurs de la série qui ont déjà été calculées.
Quelque chose de FAÇON plus rapide
Calculer une passe plutôt que de façon implicite la construction d'un fibonaci(N) de la taille de l'arbre:
uint faster_fibn(uint N) { //requires N > 1 to work
uint a = 1, b = 1, c = 1;
while(--N != 0) {
c = b + a;
a = b;
b = c;
}
return c;
}
Comme certaines personnes l'ont mentionné, il ne faut pas longtemps à débordement de même un 64 bits entier non signé. Selon la taille que vous essayez d'aller, vous aurez besoin d'utiliser des entiers en précision arbitraire.