Показать сообщение отдельно
  #7 (permalink)  
Старый 21.04.2021, 09:46
Новичок на форуме
Отправить личное сообщение для Roman_ Посмотреть профиль Найти все сообщения от Roman_
 
Регистрация: 25.05.2020
Сообщений: 4

Сообщение от Vlasenko Fedor Посмотреть сообщение
Предложу функцию пошустрее
для больших чисел, в том числе отрицательных
function fib(n) {
    let k = BigInt(n < 0 ? Math.pow(-1, n + 1) : 1);
    n = BigInt(Math.abs(n));
    const calculate = n => {
        if (n === 0n) {
            return [0n, 1n];
        }
        const [a, b] = calculate(n / 2n);
        const c = a * (2n * b - a);
        const d = (a * a + b * b);
        return n % 2n === 0n ? [c, d] : [d, c + d];
    }
    const res = calculate(n);
    return res[0] * k;
}
Вот так всегда - как только появляется ощущение, что уже чего то понимаю, встречаю код который не ясен практически процентов на 80. Можете немного пояснить как это работает?
Насколько я понимаю сначала присвоили переменной k какое то условное числовое значение, далее идет часть BigInt - n, здесь n равно какому то выражению с n и далее я совершенно не понимаю((
Если не будет времени/желания - хотя бы направьте где почитать/посмотреть.
Ответить с цитированием