LeetCode - Почему эта функция возвращает неопределенное значение, хотя она только что зарегистрировала массив? - PullRequest
0 голосов
/ 17 июня 2019

Поскольку я новичок в программировании, в настоящее время я пытаюсь применить основы, которые я изучил, решая некоторые простые проблемы в LeetCode. Однако проблема «3Sum» привела меня к тому, что я просто не понимаю. Вот определение упражнения:

Учитывая массив чисел из n целых чисел, существуют ли элементы a, b, c в числах, такие что a + b + c = 0? Найти все уникальные тройки в массиве, который дает сумму нуля.

Теперь вот что я придумала:

var result = [];
var threeSum = function(nums) {
    for (let i = 1; i < nums.length; i++) {
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[0] + nums[i] + nums[j] == 0) {
                result.push([nums[0], nums[i], nums[j]])
            }
        }
    }

    if(nums.length > 3) {
        nums.shift();
        threeSum(nums);
    } else {
        console.log("result: ", result);
        return result;
    } 
};

Теперь я проверял это со следующим вводом:

[- 1,0,1,2, -1, -4]

Оператор console.log в блоке else внизу дал:

результат: [[-1, 0, 1], [-1, 2, -1], [0, 1, -1]]

Это именно то, что я хотел, чтобы он сейчас вышел из системы.

Однако приведенный ниже оператор возврата возвращает "undefined".

Поскольку они оба находятся в одном и том же блоке else, я думаю, что они оба должны быть выполнены. Как «result» может быть зарегистрирован как массив, однако возвращая его, он становится «неопределенным»?

Пожалуйста, обратите внимание, что я знаю, что это может быть неправильный способ решения этой проблемы, но этого решения недостаточно для упражнения. Я не прошу вносить какие-либо исправления, так как хочу разработать алгоритм самостоятельно, это просто тот факт, что в этом случае «результат» кажется одновременно определенным и неопределенным:)

1 Ответ

0 голосов
/ 17 июня 2019

Вы почти у цели. Просто добавьте возврат, чтобы выполнить рекурсию:

var result = [];
var threeSum = function(nums) {
    for (let i = 1; i < nums.length; i++) {
        for (let j = i + 1; j < nums.length; j++) {
            if (nums[0] + nums[i] + nums[j] == 0) {
                result.push([nums[0], nums[i], nums[j]])
            }
        }
    }

    if(nums.length > 3) {
        nums.shift();
        return threeSum(nums);  // <-- return here
    } else {
        return result;
    } 
};

console.log(threeSum([-1,0,1,2,-1,-4]))
...