列出1、2和3加起来可以等于4的所有方式,顺序很重要.例如,[1, 1, 1, 1]是单向的.[1,1,2]不同于[1,2,1]

我已经想出了一种在纸面上有效的方法.但我还是不能为它写代码.请帮帮忙,请看这张My Idea分的照片,以求清晰.

我写的这个代码失败了.但这就是我所能做的.

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))

当我console.log('sum', sum, 'step', cur)岁时,我得到了想要的结果:

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

我的问题是,我不知道如何将结果推送到resultsarray.它应该看起来像[[1,1,1,1], [1,1,2], [1,2,1], [1,3], [2,1,1], and on]

推荐答案

一些问题:

  • 尽管由递归调用返回的数组在变量c中被捕获,但该变量不会被进一步使用,因此它是无用的.

  • results被初始化为[],但随后永远不会被修改/扩展,因此最终的return result保证返回该空列表.

  • 上述两个问题需要通过迭代c中的解决方案来解决:将当前值附加到这些解决方案中(因为我们已经减go 该值以获得这些解决方案),并将这些扩展的解决方案附加到当前results数组中.

  • remaining等于0时,进行更多递归调用是没有意义的.这实际上是base case的递归.(我更喜欢在函数开始时,在递归中进行更深一层的判断:如果总和是0,我们应该返回一个空解,然后当我们返回到递归时,可以用选定的值来扩展它).

  • 无关,但更好的做法是用分号分隔语句.你不会是第一个落入automatic semicolon insertion人trap 的人.最好控制局面.

以下是更正后的版本:

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));

Javascript相关问答推荐

IMDB使用 puppeteer 加载更多按钮(nodejs)

Google Apps脚本中的discord邀请API响应的日期解析问题

react—router v6:路由没有路径

v—自动完成不显示 Select 列表中的所有项目

阿波罗返回的数据错误,但在网络判断器中是正确的

我怎么才能得到Kotlin的密文?

在forEach循环中获取目标而不是父对象的属性

本地库中的chartjs-4.4.2和chartjs-plugin-注解

Google脚本数组映射函数横向输出

FileReader()不能处理Firefox和GiB文件

处理app.param()中的多个参数

将Auth0用户对象存储在nextjs类型脚本的Reaction上下文中

如果我的列有条件,我如何呈现图标?

无法使用Redux异步函数读取未定义的useEffect钩子的属性';map';

在Press Reaction本机和EXPO av上播放单个文件

AstroJS混合模式服务器终结点返回404

react :图表负片区域不同 colored颜色

将promise列表拆分到组.按组并行和顺序执行所有promise

JAVASCRIPT|导入模块中断FOR循环

在继续循环之前,请等待带有异步调用的函数完成