Как этот алгоритм сглаживания не забывает переменную? - PullRequest
0 голосов
/ 02 апреля 2020

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

const arr = [1,[[4,5],4,[9,8]]];

const result = [];
const flatten = arr =>
{

    arr.forEach(elem =>{
        if(Array.isArray(elem))
        {
            flatten(elem);
        }
        else{
            result.push(elem);
        }
    })
    return result;
}


console.log(flatten(arr))

, затем я нашел решение в Google и нашел решение, которое было больше похоже на это.

const arr = [1,[[4,5],4,[9,8]]];


const flatten = arr =>
{
    let result = [];
    arr.forEach(elem =>{
        if(Array.isArray(elem))
        {
            result = result.concat(flatten(elem));
        }
        else{
            result.push(elem);
        }
    })
    return result;
}


console.log(flatten(arr))

Как видите, переменная result есть в функции, но тогда функция рекурсивная, как она сохраняется? спасибо.

1 Ответ

0 голосов
/ 02 апреля 2020

Попробуйте запустить этот код и следите за журналами. Вы поймете, как работает рекурсия.

const arr = [1,[[4,5],4,[9,8]]];


(flatten = arr =>
{
    let result = [];
    console.log(`initialized result for element ${arr} ${result}`)
    arr.forEach(elem =>{
        if(elem.length)
        {   console.log(`updating result if we get an array ${result.length}`)
            result = result.concat(flatten(elem));
            console.log(`result updated in case of array ${result}`)
        }
        else{
            console.log(`updating result if we get a number ${result.length}`)
            result.push(elem);
            console.log(`result updated in case of number ${result}`)
        }
    })
    return result;
})(arr)
...