Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

187
Views
Javascript Enumera todas las formas en que 1, 2 y 3 pueden sumar 4, el orden es importante. Por ejemplo, [1, 1, 1, 1] es una manera

Enumera todas las formas en que 1, 2 y 3 pueden sumar 4, el orden es importante. Por ejemplo, [1, 1, 1, 1] es una forma. [1,1,2] es diferente de [1,2,1]

He descubierto una forma en que funciona en papel. Pero todavía no puedo escribir el código para ello. Por favor, ayuda y mira esta imagen de Mi idea para mayor claridad.

Este código que escribí falló. Pero esto es lo lejos que tengo.

 function theseAddToSum(steps = [], sum) { let results = []; if (steps.length < 1) return 'error' for (let i = 0; i < steps.length; i++) { let cur = steps[i]; let remaining = sum - cur; if (remaining >= 0) { console.log('sum', sum, 'step', cur) let c = theseAddToSum(steps, remaining) } } return results } console.log(theseAddToSum([1, 2, 3], 4))

Como console.log('sum', sum, 'step', cur) , obtengo los resultados deseados:

 sum 4 step 1 sum 3 step 1 sum 2 step 1 sum 1 step 1 sum 2 step 2 sum 3 step 2 sum 1 step 1 sum 3 step 3 sum 4 step 2 sum 2 step 1 sum 1 step 1 sum 2 step 2 sum 4 step 3 sum 1 step 1

Mi problema es que no sé cómo enviar el resultado a la matriz de results . Debería verse como [[1,1,1,1], [1,1,2], [1,2,1], [1,3], [2,1,1], and on]

about 4 years ago · Juan Pablo Isaza
2 answers
Answer question

0

Algunos asuntos:

  • Aunque el array devuelto por la llamada recursiva está capturado en la variable c , esa variable no se usa más adelante, por lo que ha sido inútil.

  • results se inicializa como [] , pero luego nunca se modifica/extiende, por lo que se garantiza que el return result final devuelto devolverá esa lista vacía.

  • Los dos problemas anteriores deben resolverse iterando las soluciones presentes en c : agregue el valor actual a esas soluciones (ya que restamos ese valor para obtener esas soluciones) y agregue esas soluciones extendidas a la matriz de results actual.

  • Cuando remaining es igual a 0, no tiene sentido hacer más llamadas recursivas. Este es en realidad un caso base de la recursividad. (Prefiero hacer esta verificación un nivel más profundo en la recursividad, al comienzo de la función: si la suma es 0, deberíamos devolver una solución vacía que luego puede extenderse por los valores seleccionados a medida que salimos de la recursividad) .

  • Sin relación, pero es una mejor práctica separar sus declaraciones con punto y coma. No sería el primero en caer en una de las trampas de la inserción automática de punto y coma . Mejor toma el control.

Aquí hay una versión corregida:

 function theseAddToSum(steps = [], sum) { // Base cases: if (sum < 0) return []; // No solutions if (sum == 0) return [[]]; // A solution let results = []; if (steps.length < 1) return 'error'; for (let i = 0; i < steps.length; i++) { let cur = steps[i]; let remaining = sum - cur; let c = theseAddToSum(steps, remaining) // Use the solutions we got back from recursion for (let solution of c) { solution.push(cur); // ... then extend them results.push(solution); // ... and collect them } } return results; } console.log(theseAddToSum([1, 2, 3], 4));

about 4 years ago · Juan Pablo Isaza Report

0

Esta es una oportunidad perfecta para usar backtracking . La idea de retroceder es que nos propusimos probar todas las combinaciones posibles, pero cuando nuestra combinación actual falla y no podemos continuar construyendo sobre ella, entonces regresamos e intentamos otra cosa.

La forma en que abordamos un problema de retroceso es la siguiente:

  1. Averiguar cómo podemos dividir nuestra respuesta en partes o pasos
    • Entonces, para este problema, como ya lo hizo, dividimos la solución en una matriz.
    • Consideraremos cada valor en la matriz como un paso en la construcción de nuestra solución.
  2. Encontrar una manera de encontrar todas las soluciones posibles en cada paso
    • Para esta pregunta, las posibles soluciones son los valores en la matriz de entrada [1,2,3]
  3. Configura un ciclo que probará todas las soluciones
    • La razón por la que dije configurar es porque aunque comenzaremos la primera iteración, la idea no es iterar directamente todas las soluciones en nuestro paso actual.
    • Intentaremos construir nuestra solución con nuestro paso actual como parte de esa solución.
  4. Comience en el primer paso de solución posible:
    • Agréguelo a su matriz de solution
    • Compruebe si es posible continuar construyendo la solución.
      • En esta pregunta, si la suma de nuestros pasos es mayor que 4, no podemos seguir construyendo.
    • Si es posible, recurra, con nuestra solución actual como punto de partida.
      • Repita los pasos 3 - 4
    • Si no es posible seguir construyendo, elimine el paso actual de la solución y ahora podemos iterar el bucle para probar la siguiente solución posible en el paso actual.
  5. Cada vez que recurrimos, verificamos si nuestra solución resuelve nuestra entrada principal y, si lo hace, la agregamos a una matriz.

Son muchas palabras, resolvamos la pregunta:

 const getSum = (arr) => arr.reduce((acc, num) => num + acc, 0); function theseAddToSum(steps, sum) { const solutions = []; function recurse(steps, sum, currentSol) { if (getSum(currentSol) === sum) { solutions.push([...currentSol]); return } for (let i = 0; i < steps.length; i++) { currentSol.push(steps[i]); if (getSum(currentSol) <= sum) { recurse(steps, sum, currentSol); } currentSol.pop(); } } recurse(steps, sum, []) return solutions; } console.log(theseAddToSum([1, 2, 3], 4));

about 4 years ago · Juan Pablo Isaza Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!