JavaScript在递归函数中保留原始数组
我希望保留原始数组以在递归函数中返回原始索引。 原始代码来自rbarilani。 请帮助建议如何更改线路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,剩余; 部分=部分| |[];
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;i findSubSet([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);