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