Рубрики
Без рубрики

12+ способов к Фибоначчи

Этим утром я наткнулся на отличную маленькую бумагу, показывающую двенадцать алгоритмов для вычисления номера Фибоначчи … Tagged с JavaScript, Polidy, компьютерной наукой.

Этим утром я наткнулся на великий Маленькая бумага показывая двенадцать алгоритмов для вычисления чисел Фибоначчи в Python. Я должен был поделиться!

Расчет чисел Фибоначчи рекурсивно используется для эталонные компьютерные языки а иногда интервьюеры пытаются произвести впечатление на ищущих работу. Что еще более важно, это вдохновило одного из Величайшие песни Когда-либо Так что стоит вспомнить несколько из этих алгоритмов и спирали: o)

Чтобы не повторять примеры Python из бумаги, давайте вместо этого посмотрим на четыре способа вычислить номер Fibonacci N в JavaScript.

//ES6

// using recursion
const fibonacci = n => n <= 2 ? 1 : fibonacci(n - 1) + fibonacci(n - 2);

// using cache
const fibCached = (n, cache = {1: 1, 2: 1}) => cache[n] ? cache[n] : cache[n] = fibCached(n - 1, cache) + fibCached(n - 2, cache);

// using tail recursion
const fibTailRecursed = (n, sum = 1, prev = 1) => n <= 2 ? sum : fibTailRecursed(n - 1, sum + prev, sum);

// using Binet's formula
const fibBinet = n => Math.floor( (((1 + Math.sqrt(5)) / 2 ) ** n) / Math.sqrt(5) + 0.5);

Эта очень интересная формула, обнаруженная Бине я поймал глаза несколько лет назад, когда я выяснил Это может быть использовано в интеллектуальных контрактах.

Виртуальная машина Ethereum – это ограниченная ресурсная среда, в которой каждая операция измерена и заплачен, что препятствует использованию рекурсии или итерации, но понимание ее глубины делает его лучшим программистом IMHO.

//Solidity v0.5+

function fibBinet(uint n) external pure returns(uint a) { 
    if (n <= 2) return 1;   

    uint h = n / 2; 
    uint mask = 1;

    // find highest set bit in n
    while(mask <= h) mask <<= 1;

    mask >>= 1;
    a = 1;
    uint b = 1;
    uint c;

    while(mask > 0) {
        c = a * a + b * b;          
        if (n & mask > 0) {
            b = b * (b + 2 * a);  
            a = c;                
        } else {
            a = a * (2 * b - a);  
            b = c;                
        }
        mask >>= 1;
    }
    return a;
}

Определенно не так элегантно, как версия ES6 Fat Arrow, но это связано с тем, как Ethereum Типовая система работает.

Оригинал: “https://dev.to/jpantunes/12-ways-to-fibonacci-17b1”