
Добро пожаловать в серию 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.
И это все на сегодня! Довольно просто да? Вы чувствуете, что могли бы сделать это лучше или по-другому? Присоединяйтесь к обсуждению в комментариях 😄