Добро пожаловать в серию Codewars. Новая серия подробных и объясненных ответов на ответы codewars.com!! Зачем тратить время, давайте возьмем! Вот оригинальный вопрос.

Числа Фибоначчи — это числа в следующей целочисленной последовательности (Fn): 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, …

Одно число в ряду является суммой двух предыдущих чисел. В этом вопросе вы должны выполнить функцию productFib. Функция должна возвращать массив, содержащий три элемента, как показано ниже.

  1. Два значения в последовательности Фибоначчи, произведение которых равно или ближе всего к переданному аргументу prod.
  2. Логическое значение, показывающее, равен ли аргумент 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.

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