В большинстве интервью, на которых я присутствовал, интервьюеры просили написать программу для печати рядов Фибоначчи. Обычно я пишу программу без использования рекурсивного подхода, как показано ниже.
def fibonacci(n) return [] if n <= 0 fib_series = [0, 1] (2..n).each do |i| fib_series[i] = fib_series[i - 1] + fib_series[i - 2] end fib_series end # Example usage n = 10 fibonacci_series = fibonacci(n) puts "Fibonacci Series up to #{n}: #{fibonacci_series.join(', ')}"
Большой! Верно?
Потом нас просят написать такую же программу с использованием рекурсии.
def fibonacci(n) return [] if n <= 0 return [0] if n == 1 return [0, 1] if n == 2 fib_series = fibonacci(n - 1) fib_series << fib_series[-1] + fib_series[-2] fib_series end
Тогда у меня возникла мысль, рекурсивный способ - лучший способ сделать это? Затем я проанализировал временную сложность. Первый подход, основанный на подходе Внизу вверх, равен O(n), а рекурсивный — O(2 в степени n).
Почему же тогда интервьюеры просят писать рекурсивно?
Может быть, они просто проверяют, что мы понимаем рекурсию. Вы просто прокомментируйте это.
Заключение
Рекурсивный подход к написанию рядов Фибоначчи хуже, потому что временная сложность составляет O (2 в степени n). Просто напишите подход снизу вверх, который имеет временную сложность O (n), и вежливо спросите интервьюеров, почему мы пишем ряды Фибоначчи, используя рекурсию, когда это наихудший способ. Возможно, это точка входа в динамическое программирование.
Спасибо.