Мне нужно улучшить производительность этого алгоритма. Я считаю, что ответ заключается в применении периода pisano.Частичная сумма Фибоначчи, как улучшить производительность?
Этот алгоритм должен вернуть последнюю цифру суммы чисел фибра из f (m) в f (n).
Вот то, что я до сих пор:
def fib(n)
a = []
a << 0 << 1
(n+1).times do |i|
a << a[-1] + a[-2]
end
a[n]
end
def fib_partial_sum(m, n)
if n == m
fib(m) % 10
else
m = fib(m + 1) - 1
n = fib(n + 2) - 1
(n - m) % 10
end
end
if __FILE__ == $0
m, n = gets.split().map(&:to_i)
puts "#{fib_partial_sum(m, n)}"
end
Последняя цифра любого Фибо NUM повторяется каждые 60 номеров. Таким образом, мы можем сделать это, п, т = п% 60, м% 60. Улучшение, но не совсем там, терпит неудачу на входе 567717153638 567717153638):
def fib(n)
a = []
a << 0 << 1
(n+1).times do |i|
a << a[-1] + a[-2]
end
a[n]
end
def fib_partial_sum(m, n)
if n == m
fib(m)
else
m = m % 60
n = n % 60
m = fib(m + 1) - 1
n = fib(n + 2) - 1
(n - m) % 10
end
end
if __FILE__ == $0
m, n = gets.split().map(&:to_i)
puts "#{fib_partial_sum(m, n)}"
end
Если это будет на [код обзор] (https://codereview.stackexchange.com/)? Если это не код, который не работает. Название говорит о том, что это так, но опрос производительности. – vgoff
У вас есть ограничение на память? Можно ли использовать методы memoization? Только глядя на свой код, вы можете оптимизировать вызовы 'fib' на' fib_partial_sum': там есть некоторое совпадение вычислений. – cenouro
Возможно, я никогда не пользовался просмотром кода .... Я рассмотрю его – matthewalexander