我正在尝试创建一个函数,列出所有可能的重复变化。 我所做的返回“太多递归”。
function variants(amount, chars, junk){
var junkarray = junk.split(",");
var newjunk;
if(junkarray[junkarray.length-1]==amount){
newjunk = ",";
}
if(junk.length==Math.pow(chars.length, amount)){
console.log(junk);
return;
}else{
for(var i = 0; i < chars.length; i++){
variants(amount, chars, junk+newjunk+chars[i]);
}
}
}
variants(3, ["1", "2"],"");
最佳答案
你的问题是你从未达到退出子句,并且你得到了无限递归。您的问题出在这里:
var newjunk;
...
variants(amount, chars, junk+newjunk+chars[i]);
您没有将 newjunk
初始化为任何内容,因此当它跳过有机会设置它的部分时,您的变量仍然未定义。因此,当您将字符串连接到 else 子句中的其他变量时,发生的事情是 js 将值“undefined”转换为“undefined”字符串。对于测试剪切粘贴此行:
var newjunk; var junk = ""; var chars = ["1","2"]; console.log(result, junk+newjunk+chars[0]);
进入您最喜欢的控制台。请注意,它打印出 undefined1
。解决这个问题的方法是将 newjunk
初始化为空字符串:
var newjunk = ""
这是一个jsfiddle的变化。
调试递归问题的一个好方法是拿出一张纸和一支笔,对代码的每一行进行物理跟踪,以确保退出子句被命中。您还可以以全局计数变量的形式添加提前退出条件,并在函数内递增该条件。当此计数变量达到特定值时,退出。
关于javascript - "too much recursion"具有重复的变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26806625/