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

это ката из кодовых войн, вот описание ката:

подумайте о Quadribonacci, начинающемся с сигнатуры из 4 элементов, и каждый следующий элемент представляет собой сумму 4 предыдущих, Pentabonacci (ну, Cinquebonacci, вероятно, звучал бы немного более по-итальянски, но это также звучало бы действительно ужасно) с сигнатурой из 5 элементов и каждый последующий элемент является суммой 5 предыдущих и так далее.

Ну, угадайте, что? Вы должны создать функцию Xbonacci, которая принимает сигнатуру из X элементов — и помните, что каждый следующий элемент является суммой последних X элементов — и возвращает первые n элементов такой засеянной последовательности.

и это мое решение:

function Xbonacci(signature,n){
 let i=0;
  let k = n - signature.length;
   while(k--){
     let sumNums = 0;
     //let newArray = [...signature];
     signature.slice(i , signature.length ).map((num)=>{
      return sumNums += num;
     })
     
     signature.push(sumNums);
     i++
   }
  return signature;
}

код работает хорошо, но не проходит проверку из-за оптимизации. Есть ли способ сделать этот код более быстрым или оптимизированным? Я думаю, что проблема в методе срезов, но я не знаю, что использовать вместо этого.

1 ответ
1

Я думаю, что проблема в методе среза, но я не знаю, что его использовать.

Это так, но это не так просто, как вынуть slice и используя что-то другое вместо этого, проблема более фундаментальна, чем это.

Этот алгоритм плохо масштабируется до высоких значений исходной длины signature, кстати, давайте назовем это значение S, чтобы мне не приходилось все подробно описывать. Существует другой подход, не зависящий от S, путем обновления «суммы прошлых значений S» за постоянное время. Вместо того, чтобы явно брать окно из S элементов и суммировать его, можно обновить сумму предыдущего окна: одно новое значение входит в окно (добавляется к сумме), а одно старое значение выходит из окна (вычитается из суммы). Для каждого элемента вывода выполняется только одно сложение и одно вычитание, а не S сложений.

  • Спасибо, @harold. Я отредактировал свой алгоритм на основе вашего предложения, и он сработал.

    — Амир

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *