Этим утром я наткнулся на великий Маленькая бумага показывая двенадцать алгоритмов для вычисления чисел Фибоначчи в 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”