Estaba trabajando en una solución para el siguiente mensaje: Dada una matriz de números enteros distintos, devuelva todas las permutaciones posibles. Puede devolver la respuesta en cualquier orden.
El siguiente código pasa las pruebas:
/** * @param {number[]} nums * @return {number[][]} */ const permute = function(nums) { const results = []; const backtrack = (first = 0) => { if (first === nums.length) { results.push([...nums]); return } for (let i = first; i < nums.length; i++) { nums = swap(nums, first, i); backtrack(first + 1); nums = swap(nums, first, i) } } backtrack() return results }; const swap = (arr, i, j) => { const temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; return arr; } Considere un ejemplo para calcular las permutaciones donde nums = [1, 2, 3] .
La brecha en mi comprensión es evidente cuando trato de pasar nums a results.push() en lugar de results.push([...nums]) , que devuelve la matriz de resultados de longitud adecuada, pero se llena con [1, 2, 3] matriz en cada índice. ¿Por qué es necesario hacer una copia superficial de nums aquí en lugar de simplemente presionar nums directamente? Tengo entendido que en el punto de la llamada recursiva donde se satisface el caso base, nums será cualquiera que sea la permutación actual. Después del almacenamiento de nuestra permutación, retrocedemos/desintercambiamos nums y continuamos. Supongo que debe ser el caso de que todas las permutaciones en la matriz de result siempre reflejen el valor actual del elemento de referencia, pero si ese es el caso, ¿por qué la matriz de resultados final se llena con [1, 2, 3] para cada ¿elemento?
Pensé que anteriormente tenía una sólida comprensión de pasar por referencia frente a pasar por valor, pero ahora dudo de esa comprensión. Cualquier aclaración sobre esto sería muy apreciada, ya que siento que casi estoy allí, pero no puedo hacer que haga clic.
Gracias por tomarse el tiempo para leer / ayudar.