javascript - "too much recursion"具有重复的变化

标签 javascript recursion combinatorics

我正在尝试创建一个函数,列出所有可能的重复变化。 我所做的返回“太多递归”。

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/

相关文章:

c - 在 C 中跟踪递归

random - 以均匀随机的方式选择一个子集?

javascript - 具有自动宽度的 Owl Carousel 元素

javascript - Nuxt : displaying local image from static folder

c - Id 返回 1 退出状态错误

optimization - Common Lisp 中的高效收集函数

prolog - 骑士之旅高效解决方案

Julia:用重复项生成集合中的所有非重复排列

javascript - 需要正则表达式以允许最多 3 个特殊字符

JavaScript YAML 解析器