Каким образом рассчитывается функция фибоначчи?

Здравствуйте. Объясните, каким образом рассчитывается данная функция, какова последовательность?

function fibo($x){
	if ($x < 3) {
        return 1; 
    }else{
		return fibo($x-1) + fibo($x-2);
	};
};
	echo fibo(10);
  • Вопрос задан
  • 340 просмотров
Пригласить эксперта
Ответы на вопрос 4
keksmen
@keksmen
Just a programmer
Во-первых, ваш алгоритм не совсем корректен.
function Fibo(n) {
    if (n<2)
        return n;
    else
        return FIBO(n-1)+FIBO(n-2);
};

Во-вторых, в принципе, такой алгоритм является крайне медленным. Вот пример его стэка вызовов для пятого числа.
78d000dd78de4f5c92b57cc8d2e8d4f0.png
Если не вдаваться в подробности, то уже 50-е число такой алгоритм будет считать несколько минут.

Посему могу предложить использовать memoize подход (как в underscore)
var FIBO2=_.memoize(function(n) {{
    if (n<2)
        return n;
    else
        return FIBO2(n-1)+FIBO2(n-2);
});

либо воспользоваться итеративным алгоритмом
function FIBO3(n) {
    if (n<2) return n;
    var x=0,
        y=1,
        z;
    for (var i=1; i<n; i++) {
        z=x+y;
        x=y;
        y=z;
    }
    return z;
};


Итеративный алгоритм опережает остальные по скорости на несколько порядков при разовых вычислениях, однако memoize подход позволяет сэкономить на вычислениях при частом использовании функции (+за одно выполнение закэшируются результаты для всех n, стоящих перед требуемым).
Ответ написан
vanya_beseda
@vanya_beseda
Front End
Комментировать
@GreatRash
Можно вычислять чилсо Фибоначчи при помощи формулы Бине.
Ответ написан
Комментировать
@kir_vesp
Web Developer
Рекурсивный подсчёт n-го числа в последовательности Фибоначчи.
Например:
#fibo(4)
#fibo(4)->fibo(3)+fibo(2)
#fibo(2)-> return 1
#fibo(3)-> fibo(2) + fibo(1)
#fibo(2)-> return 1
#fibo(1)-> return 1
#fibo(3)-> return 1+1
#fibo(4)-> return 2+1
#return 3
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы
21 нояб. 2024, в 19:31
500 руб./за проект
21 нояб. 2024, в 19:28
200000 руб./за проект