Как работает данный код? JS
Как работает finalPermutations?
function permutations(string) {
if (string.length <= 1) {
return [string];
}
let finalPermutations = permutations(string.substring(1))
.reduce((acc, p) => {
let charList = p.split('');
for (let i = 0; i <= charList.length; i++) {
let newPermutation = charList.slice(0, i)
.concat([string[0]])
.concat(charList.slice(i))
.join('');
if (!acc.includes(newPermutation)) {
acc.push(newPermutation);
}
}
return acc;
},[]);
return finalPermutations;
}
Ответы (1 шт):
Я попытаюсь объяснить, но если Вы всё равно не поймёте, настоятельно советую обратиться к учебнику и внимательно прочитать раздел про рекурсию.
Предположим у нас происходит вызов: permutations('123');
Условие...
if (string.length <= 1) {
return [string];
}
оказывается ложным и мы попадаем на следующую строку let finalPermutations = permutations(string.substring(1)), гду функция вызывает саму себя по факту в следующем виде let finalPermutations = permutations('23'). Происходит первый шаг рекурсии.
Далее происходит всё тоже самое, где функция вызывается вот так: let finalPermutations = permutations('3'). И в этом вызове мы достигаем базы рекурсии, т.е. того момента, когда функции больше не нужно вызывать саму себя. Она попадает внуть условия, которое по факту на данный момент выглядет так:
if ('3'.length <= 1) {
return ['3'];
}
Теперь мы движемся назад по рекурсии. Внутри вызова permutations('23') база ркурсии превращает вот этот вызов let finalPermutations = permutations('3').reduce((acc, p) => ...), конкретно вот в это: let finalPermutations = ['3'].reduce((acc, p) => ...).
Далее уже начинает отрабатывать колбэек редюсера, который по завершению вырнёт в следующий верхний уровень рекурсии массив: ['23, '32'].
Так как следующий верхний уровень рекусрии является точкой входа в рекурсию вообще, то конечный результатом функции будет массив: ['123', '213', '231', '132', '312', '321'].
Вот всё тоже самое, что я попытался объяснить, только в виде схемы:
шаг рекурсии база рекурсии
premutations('123') ------------> premutations('23') --> premutations('3')
|
результат базы рек.
['3'].reduce() <-- ['3']
|
здесь мы принимаем
результат базы рекурсии
и начинаем отрабатывать
дальше по функции, и получаем
|
['23', '32'].reduce() <-- ['23', '32']
|
Конечный результат.
['123', '213', '231', '132', '312', '321']
P.S.
Если Вы не понимаете как мы получаем тот или иной результат после завершения метода reduce, то здесь рекомендую внимательно прочитать про каждый метод маcсива или строки, который в нём используется, и самостоятельно проследить каждый шаг внутри цикла.