我的計算斐波納契數的「長度」(即數位數)的方法在第1474次迭代後失敗。我獲得理想結果的方式可能非常笨拙,請讓我知道我的方法是否存在缺陷。我懷疑在無限範圍內運行阻塞方法會有些浪費,直到它在整個答案中絆倒,但在這個階段,這是最好的。我當然想要做得更好。計算斐波納契數時Ruby「FloatDomainError:Infinity」
對於除下一個較小的數字,它完美的作品,直到它到達第1474號:
49922546054780146353198579531352153533212840109029466994098142197617303359523104269471455390562835412104406019654730583800904132982935807202575490044075132631203284854890505808877430837618493577512703453928379390874730829906652067545822236147772760444400628059249610784412153766674534014113720760876471943168
,然後返回此錯誤:
FloatDomainError: Infinity
這裏是如何我的方法作品:
首先我使用標準公式獲得斐波納契數列中的「nth」數字:
def fibonacci_index(n)
((1/Math.sqrt(5)) * ((1 + Math.sqrt(5))/2) ** (n + 1)).round(0)
end
然後我的輸出轉換爲字符串,並測量其長度:
def fibonacci_index_length(n)
fibonacci_index(n).to_s.length
end
然後終於我創建無限範圍和運行內部的塊方法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
Rational如何? –
我已經添加了功能替換,儘管您可能想要使用緩存或任何您需要的來優化它,以實現所需的任何級別的性能。 – tadman
由於你沒有處理小數值,Rational在這裏沒有意義。這是爲了表達諸如「1/17」和「1/3」之類的東西而不失精確性。 – tadman