Ребята, у вас был отличный четверг?? Дайте мне знать, если вам трудно отслеживать, какой сегодня день, потому что каждый день кажется выходным из-за карантина. В любом случае, с завтрашнего дня я буду делать два раздела в своих постах, так как заметил, что некоторые из моих зрителей мало что знают о программировании. Если у вас есть предварительные знания о структурах данных и вы знакомы с ними, не стесняйтесь перейти к моменту, когда я начну решать проблему алгоритма, в противном случае я буду рассматривать одну структуру данных в каждом посте в течение следующих нескольких дней.
Однако сегодня нам нужно сделать функцию, которая вызывается с целым числом в качестве входных данных. Функция вернет такое же количество строк треугольника Паскаля, как массивы внутри большего массива. Я покажу вам пример:
generate(5); //function returns [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ]
Я попытался придумать рекурсивное решение, потому что знаю, что для создания алгоритма, который строит последовательность Фибоначчи, это очень выполнимо, однако это оказалось довольно сложно. Поэтому я решил изменить свой подход к итеративному решению. Я начал с базового случая, когда, если входное целое число было равно 0, функция возвращала пустой массив.
Затем я повторяю столько, сколько входное целое число, поэтому в приведенном выше примере я бы повторил пять раз. Во время итерации я знаю, что первая и последняя записи каждого подмассива должны быть одним, поэтому я бы закодировал это так:
res[i] = new Array(i + 1); res[i][0] = res[i][i] = 1;
Я знаю, что после первого и второго подмассивов мне придется добавить значения, отличные от одного, поэтому я поместил еще один цикл for внутри исходного цикла.
for(let j = 1; j < i; j++){ res[i][j] = res[i - 1][j-1] + res[i - 1][j]; }
Я провел некоторые математические вычисления, чтобы выяснить, что res[i][j] будет равно уравнениям в приведенном выше коде. Затем я возвращаю массив результатов с правильным количеством строк. Итак, полное решение:
var generate = function(numRows) { if(numRows === 0) return []; let res = []; for(let i = 0; i < numRows;i++){ res[i] = new Array(i + 1); res[i][0] = res[i][i] = 1; for(let j = 1; j < i; j++){ res[i][j] = res[i - 1][j-1] + res[i - 1][j]; } } return res; };
Дайте мне знать, если у вас, ребята, есть какие-либо вопросы или вы узнали что-нибудь, спасибо!