Добро пожаловать в серию Codewars. Новая серия подробных и объясненных ответов на ответы codewars.com!! Зачем тратить время, давайте возьмем! Вот оригинальный вопрос.
Числа Фибоначчи — это числа в следующей целочисленной последовательности (Fn): 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, …
Одно число в ряду является суммой двух предыдущих чисел. В этом вопросе вы должны выполнить функцию productFib. Функция должна возвращать массив, содержащий три элемента, как показано ниже.
- Два значения в последовательности Фибоначчи, произведение которых равно или ближе всего к переданному аргументу prod.
- Логическое значение, показывающее, равен ли аргумент prod вычисляемому продукту или нет. Истина, если значения равны, и ложь, если они не равны.
Пример
productFib(714) # should return (21, 34, true),
Давайте Код!! На первом этапе нам нужна функция, которая генерирует для нас последовательность Фибоначчи.
function getNextFibonacci(arr) { arr.push(arr[arr.length - 1] + arr[arr.length - 2]); return arr; }
Функция getNextFibonacci принимает массив чисел Фибоначчи, добавляет к массиву следующее число Фибоначчи и возвращает его. Довольно просто и чисто.
Нам также нужна функция, которая возвращает произведение двух последних элементов последовательности Фибоначчи.
function getProdOfLastTwoElements(arr) { return arr[arr.length - 1] * arr[arr.length - 2]; }
Функция getProdOfLastTwoElements принимает массив, содержащий числа Фибоначчи, и возвращает произведение двух последних элементов.
Теперь наше решение будет использовать цикл while для выполнения до тех пор, пока мы не достигнем значения, которое по крайней мере равно или действительно близко к переданному значению prod.
function productFib(prod) { let fibonacciSequence = [0, 1]; let lastTwoElementsProduct = getProdOfLastTwoElements(fibonacciSequence); while (lastTwoElementsProduct !== prod) { fibonacciSequence = getNextFibonacci(fibonacciSequence); lastTwoElementsProduct = getProdOfLastTwoElements(fibonacciSequence); if (lastTwoElementsProduct > prod) { return [ fibonacciSequence[fibonacciSequence.length - 2], fibonacciSequence[fibonacciSequence.length - 1], false, ]; } } return [ fibonacciSequence[fibonacciSequence.length - 1], fibonacciSequence[fibonacciSequence.length - 2], true, ]; }
В коде мы инициализируем последовательность Фибоначчи первыми двумя элементами 0 и 1.
Внутри цикла while мы запускаем проверку if, чтобы проверить, превышает ли произведение двух последних элементов количество проходов в prod. Если это так, мы возвращаем массив из последнего элемента, предпоследнего элемента и false, поскольку он не равен аргументу.
Однако если мы получим продукт, эквивалентный переданному в prod, цикл while не запускается, и мы возвращаем последний элемент, предпоследний элемент и значение true.
И это все на сегодня! Довольно просто да? Вы чувствуете, что могли бы сделать это лучше или по-другому? Присоединяйтесь к обсуждению в комментариях 😄