Эта функция написана на JavaScript, но я думаю, что концепция может быть реализована с некоторыми другими языками программирования.
function uniteUnique(arr) {
let seenBefore = []; //the accumulating array
for (let item of arguments) {
if (typeof (item) == "object") {
uniteUnique(...item);
}
else if (!seenBefore.includes(item)) {
seenBefore.push(item);
}
}
return seenBefore;
}
Короче говоря, функция выполняет итерацию по массивам, которые она получает в качестве аргументов, которые могут содержать или не содержать сами другие массивы.самый глубокий уровень любого из этих массивов содержит значения int
.Функция возвращает массив, который содержит все эти int
s (то есть те, которые появились во вложенных массивах), но она возвращает каждое int только один раз, даже если оно появилось более одного раза.
Моя проблема заключается втот факт, что каждый раз, когда рекурсия возвращается на более высокий уровень, она снова инициализирует массив, который содержит сохраненные int
s, а именно массив, который должна вернуть функция (seenBefore
), и, следовательно,рушит весь процесс.С одной стороны, я должен инициализировать массив при запуске функции, но с другой стороны, он инициализируется более одного раза и теряет свои ранее сохраненные значения.
например, если бы я запустил функцию
uniteUnique([1, 3, [6, 3], 2], [5, 2, 1, 4], [2, 1]);
, результат должен быть
[1,3,6,2,5,4]
, потому чтофункция должна возвращать числа, на которые она наткнулась, только один раз в порядке их обработки.Функция фактически возвращает пустой массив, потому что он снова инициализируется непосредственно перед тем, как функция возвращается с самого верхнего уровня рекурсии.
Как я могу обойти эту проблему?
(PS: я знаю, что это можно «решить», вытянув накопительный массив из функции в другую область, но это вызывает другие проблемы, такие как необходимость повторной инициализации накопительного массива каждый раз, прежде чем язапустить функцию, если я запустил ее несколько раз.)