Meine Methode zur Berechnung der "Länge" einer Fibonacci-Nummer (d. H. Anzahl der Ziffern) schlägt nach der 1474. Iteration fehl. Meine Art, das gewünschte Ergebnis zu erzielen, ist wahrscheinlich sehr ungeschickt. Bitte lassen Sie mich wissen, ob es einen Fehler in meinem Ansatz gibt. Ich vermute, dass es etwas ziemlich Verschwenderisches gibt, wenn man eine Blockmethode über eine unendliche Bandbreite laufen lässt, bis sie über die Antwort stolpert, aber in diesem Stadium ist es das Beste, was ich habe. Ich würde es sicherlich gerne noch besser machen.Ruby "FloatDomainError: Unendlichkeit" bei der Berechnung von Fibonacci Nummer
Für Zahlen kleiner als die unten, es funktioniert perfekt, bis er an die 1474. Nummer bekommt:
49922546054780146353198579531352153533212840109029466994098142197617303359523104269471455390562835412104406019654730583800904132982935807202575490044075132631203284854890505808877430837618493577512703453928379390874730829906652067545822236147772760444400628059249610784412153766674534014113720760876471943168
Und danach gibt diesen Fehler zurück:
FloatDomainError: Infinity
Hier ist, wie meine Methode funktioniert :
Zuerst verwende ich die Standardformel, um die "nth" Zahl in einer Fibonacci-Folge zu erhalten:
def fibonacci_index(n)
((1/Math.sqrt(5)) * ((1 + Math.sqrt(5))/2) ** (n + 1)).round(0)
end
Dann konvertiere ich die Ausgabe in einen String und messen seine Länge:
def fibonacci_index_length(n)
fibonacci_index(n).to_s.length
end
Und dann schließlich erstelle ich eine unendliche Reihe und einen Block Methode innerhalb einer while-Schleife laufen:
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
Was ist mit Rational? –
Ich habe einen Funktionsersatz hinzugefügt, obwohl Sie ihn vielleicht mit einem Cache oder was auch immer Sie benötigen, um das gewünschte Leistungsniveau zu erreichen, optimieren möchten. – tadman
Da es sich nicht um Bruchwerte handelt, ist Rational hier nicht sinnvoll. Das bedeutet, Dinge wie "1/17" und "1/3" auszudrücken, ohne die Präzision zu verlieren. – tadman