Войти
Главная / JavaScript / Числа Фибоначчи, как учат в учебниках и как их лучше искать

Числа Фибоначчи, как учат в учебниках и как их лучше искать

Добавлено 07 Фев 2012 | Раздел: JavaScript | Автор: 7

Одна из первых тем, которой учат в учебниках по программированию — это рекурсия. Это довольно сложная для понимания тема, ну то есть для некоторых (для меня например). И почти в 90% учебников рекурсию рассматривают на примере чисел Фибоначчи.

Числа Фибоначчи — это последовательность чисел, в которой каждое следующее число является суммой двух предыдущих чисел. Начинается последовательность с нуля и единицы (ноль иногда опускают). Выглядит это так:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34… и так до бесконечности

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

Вот так, примерно, будет выглядеть рекурсия для нахождения n-ного числа:

function fibonacci(n) {
  var num;

  if (n >= 2) {
    num = fibonacci(n - 1) + fibonacci(n - 2);
  } else {
    num = n
  }

  return num;
}

alert(fibonacci(6)); // >>> 8

Всё хорошо, функция отлично находит шестое число в последовательности. Но это только пока… Я не знаю насколько мощный у вас комп, но попробуйте найти пятидесятое число:

alert(fibonacci(50));

Уверяю вас, комп ощутимо задумается, если не повиснет в принципе. То есть эта функция – отличный пример рекурсии, и, вместе с тем, отличный пример того, что рекурсия не самый лучший способ решить задачу. Рекурсия очень прожорлива к ресурсам компа, поэтому нужно, по возможности, её избегать.

Итак как же нам найти любое число в последовательности Фибоначчи? Лезем в википедию и узнаём, что нам на помощь приходит формула Бине:

Нас интересует часть до первого знака равенства, реализуем её:

function fibonacci2(n) {
  var sq5 = Math.sqrt(5); // сохраняем значение корня из 5, чтобы сэкономить ресурсы
  var a = (1 + sq5) / 2;
  var b = (1 - sq5) / 2;
  return (Math.pow(a, n) - Math.pow(b, n)) / sq5;
}

alert(fibonacci2(500)); // >>> 1.3942322456169767e+104

Как видим новая функция с легкостью вычислила пятисотый член последовательности, что было бы практически нереально для рекурсии.

Ссылка на пример

Ссылка на источник

Числа Фибоначчи, как учат в учебниках и как их лучше искать, 8.7 out of 10 based on 15 ratings
Оцените статью: 
VN:F [1.9.15_1155]
  8.7/10 (Проголосовало: 15)
Понравилась статья? Поделись ею со своими друзьями.

Подпишитесь на обновление блога!

Ваш e-mail:

Понравилась статья? Вы не хотите пропускать новые статьи, посвященные качественной верстке? Тогда подпишитесь на RSS или на электронный ящик и получайте новые статьи мгновенно! Также можете следить за мной в Twitter.

7 комментариев к “Числа Фибоначчи, как учат в учебниках и как их лучше искать”

  • Николай пишет:

    Хм, если запоминать уже посчитанные члены в какой нибудь массив, и проверять на входе в функцию – считали ли мы этот член, то будет тоже быстро. (Правда не зна в js есть массивы или нет, это же javascript?)

  • Gaspode пишет:

    Указанный способ чреват потерей точности. Так надёжнее:
    return Math.ceil((Math.pow(a, n) – Math.pow(b, n)) / sq5);
    Иначе уже на десятом числе спотыкаемся.

    • GreatRash GreatRash пишет:

      Согласен, из-за неточности вычислений с плавающей точкой результат нужно округлять.

  • Николай пишет:

    Я пока не готов приступить к javascript, а так спасибо!

  • Артем пишет:

    Вот пример нормальной рекурсии с линейной сложностью (а не с 2 ^ n, как в примере)

    function fibonacci(first, second, n)
    {
    if (n == 0 || n == 1) return n;
    if (n == 2) return first + second;
    return fibonacci(second, first + second, n – 1);
    }

    alert(fibonacci(0, 1, 6));

Оставить комментарий

Получать новые комментарии по электронной почте. Вы можете подписаться без комментирования.

Подписка

Если хотите быстро и оперативно получать последние новости и статьи, то рекомендуем подписаться на обновления блога по E-mail:


Мы на Facebook

Мы ВКонтакте