Вы спрашиваете: «Почему вы должны вызвать функцию внутри себя?» Ну, строго, вы этого не делаете.
Fibonacci sequence представляет собой последовательность чисел, определенных настоящим математической рекурсии:
- = 0
- = 1
- п = а n-1 + a n-2
Исходная функция вычисляет эту последовательность, хотя и неэффективно. Если Index
равно 0, он возвращает 0; если он равен 1, он возвращает 1. В противном случае он возвращает GetFibNumber(Index - 1) + GetFibNumber(Index - 2)
, что и является математическим определением. Для каждого элемента последовательности вы должны добавить два предыдущих слова в последовательности.
Ваш код просто возвращает Index - 1 + Index - 2
, что даст другую численную последовательность. Для сравнения:
- Фибоначчи: 0, 1, 1, 2, 3, 5, 8, 13, 21, 36 ...
- Ваш: 0, 1, 1, 3, 5, 7, 9 , 11, 13, 17 ...
Но в остальном вам не нужна рекурсивная функция для вычисления этой математической рекурсии. Все, что вам нужно, это просто for
петля:
int GetFibNumber(int FibIndex)
{
if(FibIndex < 2)
return FibIndex;
int a_n_2 = 0, a_n_1 = 1, a_n;
for (i = 2; i < FibIndex; i++)
{
a_n = a_n_1 + a_n_2;
a_n_2 = a_n_1;
a_n_1 = a_n;
}
return a_n;
}
Такой подход будет гораздо быстрее, а также.
Рекурсивный метод математически корректен. Тем не менее, он медленнее, потому что он не использует повторные вычисления. Он вычисляет n-1, перерабатывая рекурсию на обратном пути до . Затем он вычисляет n-2 без повторного использования какой-либо работы, которая сгенерировала n-1. И если вы считаете, что это отсутствие повторного использования происходит на каждом этапе рекурсии, вы увидите, что running time grows exponentially for the recursive function. Он растет линейно для цикла for
.
Advanced тема: Существует способ сделать рекурсивную версии работать быстрее, и это может быть важно знать, если вы столкнулись с проблемой программирования, который наиболее легко определен рекурсивно. Как только вам станет намного удобнее C++, найдите memoization. Воспоминаемый рекурсивный Фибоначчи дает линейное наихудшее время выполнения и постоянное время выполнения для повторных поисков (при условии, что поиск memo сам является O (1)).
Не могли бы вы привести пример того, что вы сделали, и более четко объяснить свой вопрос. –
Что теперь читает строка 9? Без этих двух вызовов функций он не будет вычислять последовательность Фибоначчи. –
Пожалуйста, взгляните, что такое серия Фибоначчи http://en.wikipedia.org/wiki/Fibonacci_number Без вычисления последнего 'GetFibNumber (FibIndex-1) + GetFibNumber (FibIndex-2)'. – bkausbk