Ma méthode pour calculer la "longueur" d'un nombre de fibonacci (c'est-à-dire le nombre de chiffres) échoue après la 1474ème itération. Ma façon d'obtenir le résultat escompté est probablement très maladroite, alors s'il vous plaît faites-moi savoir s'il y a une faille dans mon approche. Je soupçonne qu'il y a quelque chose d'assez inutile dans l'exécution d'une méthode de blocage à travers une gamme infinie jusqu'à ce qu'elle trébuche sur la réponse, mais à ce stade, c'est le meilleur que j'ai. Je voudrais certainement faire mieux cependant.Ruby "FloatDomainError: Infinity" lors du calcul de Fibonacci Numéro
Pour les nombres inférieurs à celui ci-dessous, il fonctionne parfaitement, jusqu'à ce qu'il soit au nombre 1474e:
49922546054780146353198579531352153533212840109029466994098142197617303359523104269471455390562835412104406019654730583800904132982935807202575490044075132631203284854890505808877430837618493577512703453928379390874730829906652067545822236147772760444400628059249610784412153766674534014113720760876471943168
et retourne par la suite cette erreur:
FloatDomainError: Infinity
Voici comment mes méthode fonctionne :
D'abord j'utilise la formule standard pour obtenir le "nième" nombre dans une séquence de fibonacci:
def fibonacci_index(n)
((1/Math.sqrt(5)) * ((1 + Math.sqrt(5))/2) ** (n + 1)).round(0)
end
Puis-je convertir la sortie d'une chaîne et mesurer sa longueur:
def fibonacci_index_length(n)
fibonacci_index(n).to_s.length
end
Et puis enfin je créer une méthode gamme infinie et exécuter un bloc dans un while:
def find_fibonacci_index_by_length(integer)
# Range to infinity because I don't want to
# limit the size of the numbers I work with
infinity = 1.0/0.0
range = (1..infinity)
# while loop to run through the range
running = true
while running
range.each do |n|
f_index = n + 1
f_number = fibonacci_index(n)
f_length = fibonacci_index_length(n)
if fibonacci_index_length(n) == integer && fibonacci_index(n) != 1
puts "f_index: #{f_index}"
puts "f_number: #{f_number}"
puts "f_length: #{f_length}"
running = false
# This breaks from the block
return f_index
elsif fibonacci_index_length(n) == integer && fibonacci_index(n) == 1
running = false
return 1
else
# puts "Still looking, number is #{fibonacci_index(n)}"
puts "Still looking, Fibonacci index: #{f_index}"
puts f_number
end
end
end
end
Qu'en est-il de Rational? –
J'ai ajouté un remplacement fonctionnel, bien que vous souhaitiez l'optimiser en utilisant un cache ou tout ce dont vous avez besoin pour atteindre le niveau de performance dont vous avez besoin. – tadman
Comme vous n'avez pas affaire à des valeurs fractionnaires, Rational n'a pas de sens ici. C'est pour exprimer des choses comme "1/17" et "1/3" sans perdre de précision. – tadman