В большинстве интервью, на которых я присутствовал, интервьюеры просили написать программу для печати рядов Фибоначчи. Обычно я пишу программу без использования рекурсивного подхода, как показано ниже.

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), и вежливо спросите интервьюеров, почему мы пишем ряды Фибоначчи, используя рекурсию, когда это наихудший способ. Возможно, это точка входа в динамическое программирование.

Спасибо.