Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прошу помочь с решением задачки - число Фибоначчи и интерактивная часть (https://javascript.ru/forum/misc/82335-proshu-pomoch-s-resheniem-zadachki-chislo-fibonachchi-i-interaktivnaya-chast.html)

Roman_ 20.04.2021 17:11

Прошу помочь с решением задачки - число Фибоначчи и интерактивная часть
 
Всем доброго дня.
Написал вот такой несложный пример:

alert ('Форма вычисления числа Фибоначчи по порядковому номеру')

   let numberFib = prompt('Введите порядковый номер числа Фибоначчи')

if (numberFib == NaN  || numberFib == null) {
     alert('Введено некорректное значение')
} else {
   
   function fibonachy(numberFib) {

if (numberFib == NaN || numberFib == null) {
  
result = ('Введено некорректное значение')
}
if (numberFib <= 0) {
  result = "incorrect number"
}
if (numberFib == 1) {
    result = 0
}
if (numberFib == 2) {
    result = 1
}
if (numberFib == 3) {
    result = 2
}
if (numberFib > 3) {
    result = fibonachy(numberFib-1) + fibonachy(numberFib-2)
       return result;
   }
   }
  alert('Число Фибоначчи с порядковым номером ' + numberFib + ' равно ' + fibonachy(numberFib))
}


Хочу чтобы при вводе нечисла или вводе пустого поля программа показывала сообщение об ошибке и останавливалась. Не могу понять ЧЯДНТ, прошу помочь)))

рони 20.04.2021 17:49

число Фибоначчи
 
Roman_,
function fibonachy(numberFib) {

    if (numberFib == 1) {
        result = 2
    }
    if (numberFib == 2) {
        result = 3
    }
    if (numberFib == 3) {
        result = 5
    }
    if (numberFib > 3) {
        result = fibonachy(numberFib - 1) + fibonachy(numberFib - 2)
    }
    return result;
}


alert('Форма вычисления числа Фибоначчи по порядковому номеру');

let numberFib = prompt('Введите порядковый номер числа Фибоначчи');

if (isNaN(+numberFib) || numberFib === null || +numberFib <= 0) {
    alert('Введено некорректное значение')
} else {
    alert('Число Фибоначчи с порядковым номером ' + numberFib + ' равно ' + fibonachy(+numberFib))
}

ksa 20.04.2021 19:02

Предложу функцию покороче...

function fibonachy(numberFib) {
	if (numberFib > 3) {
		result = fibonachy(numberFib - 1) + fibonachy(numberFib - 2)
	} else {
		let a = [2, 3, 5]
		result = a[numberFib - 1]
	}
	return result;
}

Vlasenko Fedor 20.04.2021 19:12

Предложу функцию пошустрее
для больших чисел, в том числе отрицательных :)
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;
}

рони 20.04.2021 19:13

:)

Roman_ 21.04.2021 09:30

Цитата:

Сообщение от рони (Сообщение 535710)
Roman_,
function fibonachy(numberFib) {

    if (numberFib == 1) {
        result = 2
    }
    if (numberFib == 2) {
        result = 3
    }
    if (numberFib == 3) {
        result = 5
    }
    if (numberFib > 3) {
        result = fibonachy(numberFib - 1) + fibonachy(numberFib - 2)
    }
    return result;
}


alert('Форма вычисления числа Фибоначчи по порядковому номеру');

let numberFib = prompt('Введите порядковый номер числа Фибоначчи');

if (isNaN(+numberFib) || numberFib === null || +numberFib <= 0) {
    alert('Введено некорректное значение')
} else {
    alert('Число Фибоначчи с порядковым номером ' + numberFib + ' равно ' + fibonachy(+numberFib))
}

:dance:

Спасибо, добрый человек))

Пошел читать про isNaN()

Roman_ 21.04.2021 09:46

Цитата:

Сообщение от Vlasenko Fedor (Сообщение 535717)
Предложу функцию пошустрее
для больших чисел, в том числе отрицательных :)
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 и далее я совершенно не понимаю((
Если не будет времени/желания - хотя бы направьте где почитать/посмотреть.

Alexandroppolus 21.04.2021 10:31

Roman_,
Искать по словесам "fast doubling"


Часовой пояс GMT +3, время: 11:14.