Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/410.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript在递归函数中保留原始数组_Javascript_Arrays_Recursion - Fatal编程技术网

JavaScript在递归函数中保留原始数组

JavaScript在递归函数中保留原始数组,javascript,arrays,recursion,Javascript,Arrays,Recursion,我希望保留原始数组以在递归函数中返回原始索引。 原始代码来自rbarilani。 请帮助建议如何更改线路 const numList = [3,9,8,4,5.5,7,10.07]; 功能子功能(数字、目标、部分){ var s,n,剩余; const numList=[3,9,8,4,5.5,7,10.07];***/您需要围绕递归函数创建一个闭包,如: 函数findSubSet(numList,targ){ 功能子功能(数字、目标、部分){ var s,n,剩余; 部分=部分| |[];

我希望保留原始数组以在递归函数中返回原始索引。 原始代码来自rbarilani。 请帮助建议如何更改线路

const numList = [3,9,8,4,5.5,7,10.07];
功能子功能(数字、目标、部分){
var s,n,剩余;

const numList=[3,9,8,4,5.5,7,10.07];***/您需要围绕递归函数创建一个闭包,如:

函数findSubSet(numList,targ){
功能子功能(数字、目标、部分){
var s,n,剩余;
部分=部分| |[];
//部分和
s=部分还原(函数(a,b){
返回数学舍入((a+b)*100)/100;
}, 0);
//检查部分和是否等于目标值
如果(s==目标){
console.log(numList);
partial.forEach(函数(findIndex){
log(findIndex,'is at position',numList.indexOf(findIndex));
});
}
对于(变量i=0;ifindSubSet([3,9,8,4,5.5,7,10.07],15.57);
我将推荐生成器,因为它们非常适合此类问题。生成器的好处是它可以暂停和取消。这使您可以轻松找到问题的一个解决方案,或所有解决方案,而无需更改代码

函数*子序列(数字、目标、精度=2)
{函数*solve(i,q,r)
{如果(q==0)返回收益率r
if(number.length
请注意我是如何将
round
分解为它自己的函数的。隔离关注点是一种有效的编程技术,因为它使您的函数更易于读/写,并在程序的其他区域促进代码重用

const round=(n,p=0)=>
数学四舍五入(n*10**p)/10**p
我们可以得到所有的解决方案-

const解决方案=
数组。从(子节([3.27,9,8,6.8,4,5.5,7,10.07],15.57))
或者我们只需要
first
解决方案。因为生成器是可取消的,这意味着在返回第一个值后将不做任何工作-

功能优先(it)
{for(它的常数v)
返回v
}
常数解=
第一类(子类([3.27,9,8,6.8,4,5.5,7,10.07],15.57))
我们可以使用一些附加的通用函数将其包装成一个简单的HTML
表单
,其中包括步进器
,它可以遍历任何生成器,还可以使用
json
,它可以创建一个包含
json.stingify
内容的文本节点-

功能*步进器(it,f)
{设x=it.next()
而(!x.done)(收益率f(x.value),x=it.next())
而(真)产生f(“无更多结果”)
}
函数json(值)
{const e=document.createElement(“pre”)
e、 textContent=JSON.stringify(值)
返回e
}
现在我们要做的就是把它连接到表单上-


下一个
const f=
document.forms.solver
常数解算器=
步进机
(子节([3.27,9,8,6.8,4,5.5,7,10.07],15.57)
,解决方案=>
f、 appendChild(json(解决方案))
)
f、 next.addEventListener(“单击“,\=>solver.next())
运行下面的代码段,在您自己的浏览器中查看结果-

函数*子序列(数字、目标、精度=2)
{函数*solve(i,q,r)
{如果(q==0)返回收益率r
if(number.length
数学四舍五入(n*10**p)/10**p
常数f=
document.forms.solver
常数解算器=
步进机
(子节([3.27,9,8,6.8,4,5.5,7,10.07],15.57)
,解决方案=>
f、 appendChild(json(解决方案))
)
f、 next.addEventListener(“单击“,=>solver.next())

下一个
function subsetSum(numbers, target, partial) {
  var s, n, remaining;
  const numList = [3,9,8,4,5.5,7,10.07]; **//<<<<<<<The code I want to change, please advise how to make it as function input**     
  partial = partial || [];

  // sum partial
  s = partial.reduce(function (a, b) {
    return Math.round((a + b)*100)/100;
  }, 0);

  // check if the partial sum is equals to target
  if (s === target) {
    console.log(numList);
    partial.forEach(function(findIndex){
    console.log(findIndex, 'is at position ', numList.indexOf(findIndex));
});
  }

  for (var i = 0; i < numbers.length; i++) {
    n = numbers[i];
    remaining = numbers.slice(i + 1);
    subsetSum(remaining, target, partial.concat([n]));
  }
}

subsetSum([3,9,8,4,5.5,7,10.07],15.57);