Числа Фибоначчи

Вот рабочая модель.
var fibonacciNumbers = [1, 1];
var numbersQuantity = 7;
var number=fibonacciNumbers[1];
for (i=0; i<=numbersQuantity-1; i++) {
number+=fibonacciNumbers[i]
fibonacciNumbers[i+2]=number
}
console.log(fibonacciNumbers)

должно работать при любом начальном массиве:

var fibonacciNumbers = [1, 1];
var numbersQuantity = 7;

var j = fibonacciNumbers.length + numbersQuantity;

for (var i = fibonacciNumbers.length; j > i; i++){
fibonacciNumbers[i] = fibonacciNumbers[i-1] + fibonacciNumbers[i-2];
}

Хейтеры налетайте, я как обычно заюзаю reduce -

Сводка
const fibNumbers = (n, initArr) => {
  return Array(n + initArr.length).fill(0).reduce(
   (acc, _, i) => {
     if (i < initArr.length) {
       return acc;
     }
   
     return [...acc, acc[i - 1] + acc[i - 2]];
   },
   [...initArr]
 );
}

fibonacciNumbers = fibNumbers(numbersQuantity, fibonacciNumbers);
1 лайк

Кайф =) разве что нулями можно не заполнять и сам массив использовать в качестве стартового значения (т.е. не совокупность его членов […initArr]). вкусовщина по большому счету.

чутка переделал через map, т.к. reduce тут воспринимается тяжко (имхо, плес не бейте ногами, лучше обоссыте)

map
let fibonacciNumbers = [1, 3, 5, 9];
let numbersQuantity = 7;
const fibNumbers = (n, initArr) => {
  return Array(n + initArr.length).fill().map((item, i) => {
    if (i >= initArr.length) {
      initArr[i] = initArr[i - 1] + initArr[i - 2];
    }
    return initArr[i];
  });
}
fibNumbers(numbersQuantity, fibonacciNumbers);
console.log(fibonacciNumbers);
1 лайк

норм…у меня привычка из Реакта делать копии массивов и деструктуризации…
через map можно, но большой + методов в том, чтобы использовать item, i, acc - я как раз решил через reduce, чтобы задействовать acc, сам же элемент я не задействую, поэтому оставил _ вместо него)

а так решение хорошее)

все круть, прост на всякий пожарный решил попробовать через мапу, т.к. все равно в итоге имеем массив нужной длины, который преобразовать надо. один хрен это все работает медленнее простого цикла =)

1 лайк

@Hierumo у меня вопрос (собственно, он ниже)), но т.к. я вообще начинающий ноль в js, просьба сильно не бить тапками))) - мне просто нравится Ваша логика решений, поэтому полезла в эти непонятные мне дебри)) (хвала Google)), итак:

все это синтаксис ES6, как я поняла;

const fibNumbers = (n, initArr) => {} // здесь создание функции с параметрами n и initArr, где initArr это изначальный массив, а вот что такое n?! это кол-во элементов, что нам надо добавить?

return Array(n + initArr.length).fill().map((item, i) => {} // вот тут мозг слегка слетел: мы возвращаем созданный массив Array (?!) где суммируем n с длиной изначального массива, затем fill() заполняем этот массив, а затем map((item, i) что-то возвращаем с новыми параметрами item и i, которые являются результатом чего-то (чего?!)

if (i >= initArr.length) {
      initArr[i] = initArr[i - 1] + initArr[i - 2];
    }
    return initArr[i]; // тут все понятно вроде: если i больше длины изначального массива, то  initArr[i] это сумма 2-х предыдущих элементов и возвращаем return initArr[i] т.е. то, что посчитали

fibNumbers(numbersQuantity, fibonacciNumbers); // здесь вызвали нашу функцию

Суммирую поток сознания: затык тут Array(n + initArr.length).fill().map((item, i) => {}

Заранее огромное спасибо.

да, n - это кол-во элементов, что нам надо добавить

теперь по порядку:
Array(n + initArr.length) - тут мы создаем пустой массив с длиной n + initArr.length, где initArr это исходный массив, который мы получаем в виде аргумента при вызове функции (в конце). только таким образом мы можем создать массив определенной заранее длины с неизвестными (пока) элементами.

дальше .fill() - т.к. массив пока не имеет элементов, но имеет длину, заполним его пустышками, сейчас массив имеет примерно такой вид [undefined, undefined, undefined … undefined]

далее мы применяем к массиву с пустышками метод перебора массива .map()
в качестве аргумента в этом методе мы используем колбэк, т.е. внутреннюю функцию метода примерно такого вида:

function(item, i) {
    if (i >= initArr.length) {
      initArr[i] = initArr[i - 1] + initArr[i - 2];
    }
    return initArr[i];
}

в которой в качестве item используется текущий элемент нашего пустышечного массива (помните, мы перебираем такой массив методом .map(callback)),
а в качестве i - индекс этого элемента (скажем так, коллбэк перебирающих методов строго определяется стандартом JS, “функции” этих переменных заранее определены (первый - текущий элемент, второй - индекс, третий - экземпляр массива на котором вызывается перебор, тут мы используем только первые 2 (2 последних необязательные)).

итак, в коллбеке мы проверяем, является ли i больше или равно длины исходного массива (который будет fibonacciNumbers ) и если да, то определяет новые его члены, которые пойдут с индекса initArr.length. таким образом мы на каждой итерации перебирающего метода .map() на каждой пустышке вызываем коллбек, и возвращаем на место пустышки элемент исходного массива с индексом i (т.е. initArr[i] ), а если его i >= initArr.length, то возвращаем на место пустышки сумму предыдущих двух элементов исходного массива

тут все обычно выходят и закуривают в затяг, потому что можно намного проще это сделать через цикл =) но понимание этой вакханалии развивает мозг

2 лайка

Класс! Огромное спасибо, теперь поняла детали. Учиться и учиться.
P.S. Вот мне как раз мозг и надо развивать :+1:

хороший подход =) я когда курсы закончил, я думал ну все, я теперь точно топовый веб-мастер.
начал читать самоучитель по js - понял, что я знаю максимум 2% от языка =) читайте форум, используйте неизученные способы, спрашивайте если что. язык сложный

1 лайк

Читаю оч много. Этот форум радует. А вот толковая точечная помощь - это не частое явление, так что спасибо))). У меня оооочень медленно идет процесс, иногда даже сам текст задания не сразу могу понять))). Но не тороплюсь, стараюсь разобрать по-буквенно в прямом смысле)). Кстати, а какой самоучитель читали?

Илья Кантор
https://learn.javascript.ru/

кстати учебник вроде как недавно обновили, стали все чаще ES6 вводить в примеры, самое время начать по нему учиться (ну или подождите еще пару недель, т.к. главы перерабатываются сейчас ежедневно). только там задачи на порядок сложнее, чем тут. их надо рассматривать как часть теории, а не практики.

2 лайка

Я как раз Кантора и читаю)))), пока в самом начале. Спасибо :+1:

Ребят Подскажите пожалуйста есть ли жизнь данному решению этой задачи?

var fibonacciNumbers = [1, 1];
var numbersQuantity = 7;


for(var i = 0; i < numbersQuantity; i++) {
  for(var j = i; j < fibonacciNumbers.length; j++){
   var fib = fibonacciNumbers[i] + fibonacciNumbers[j];
  }
   fibonacciNumbers.push(fib);
}
   console.log(fibonacciNumbers);
1 лайк

Мой вариант:

var fibonacciNumbers = [1, 1];
var numbersQuantity = 7;
var i = 1;

while(i <= numbersQuantity){
  var fibonacciSum = fibonacciNumbers[i - 1] + fibonacciNumbers[i];
  fibonacciNumbers.push(fibonacciSum);
  i++;
}

Мне тоже этот учебник знакомый посоветовал, базу за месяц осилил, а на взаимодействии с DOM деревом что то начал пробуксовывать (HTML был в школе лет 10+ назад, про CSS только слышал что есть), вот решил подтянуть тут именно HTML и CSS, а потом вернуться и продолжить. 1 урок из браузерного JS ИМХО дал мне больше чем глава из Кантора на ту же тему. Как то не было до этого особо понимания зачем вообще JS использовать на странице, да и как. А тут как по маслу пошло, мб из за того что разобрался с HTML…
Хотя испытания здесь воспринимаются как детский лепет по сравнению с задачами из Кантора, иногда по пол дня уходило на то что бы сделать не подглядывая в решение (далеко не со всеми так вышло). Хотя когда смотришь на решение все понятно, но сам до этого так и не додумался…
P.S. уф длиннопост вышел…

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

А можешь посоветовать еще какие ресурсы на изучение после/параллельно учебнику Кантора ?
(Мне погуглить не сложно, но мне кажется ты уже рыл подобную инфу, да и хотя бы 2 “учебника” у нас сходятся ХД. Хотелось бы именно твой фитбек получить)
P.S. Я хз есть ли тут личка, но я лох не нашел…

эм, навскидку вот это:


хочешь в оригинале, хочешь на русском

а так в принципе после Кантора уже можно браться за документацию по модным фреймворкам и идти решать на собеседованиях задания на джуна