javascript - 我在用 JavaScript 编写递归函数时遇到问题 - 它似乎没有正确地将 "fall back"到更小的深度

标签 javascript recursion

            var diceToRoll = [2,2]; 
            var diceRolled = new Array(); 


            function recurse(diceToRoll, diceRolled) {      
                roll = diceToRoll[0]                        
                diceLeftToRoll = diceToRoll;                
                diceLeftToRoll.shift();                 

                for(loop=1; loop<(roll+1); loop++) {    
                    result = diceRolled;                        
                    result.push(loop);                      

                    if(diceLeftToRoll.length == 0) {        
                        console.log(result);    
                        result.pop(); 
                    } else {
                        recurse(diceLeftToRoll, result);
                    }
                }
            }

            recurse(diceToRoll, diceRolled);    

我正在尝试编写一个递归函数来打印任意数量骰子的可能结果。例如,一个 dd100 (diceToRoll = [6, 10, 10, 100])(diceToRoll = [6, 6, 6, 6, 6]) 等。这个例子我使用了最简单的情况(或两个 2 面骰子)。

我预计结果为 [1,1]、[1,2]、[2,1]、[2,2],但它只记录 [1,1]、[1,2]。这对于任何数量或类型的骰子都是一样的——只有最深层次的递归才能正确工作。

我想我在它的逻辑中遗漏了一些明显的东西/或者误解了 JavaScript 中的变量范围,但我真的很难理解它。

编辑1(为了更清楚地解释程序的目的)

该程序的目的是列出任意数量的骰子上的所有可能值。所以骰子 6 表示值的范围 1..6。同样,双面骰子 2 表示值的范围 1..2。因此,对于示例中的两个双面骰子 (diceToRoll[2,2]),可能的值为 1,1 1,2 2,1 和 2,2 - 这就是应该返回的值。

最佳答案

您的代码有几个问题:

  1. 使用 var 关键字来定义局部变量。

  2. 将数组赋给另一个变量不会复制其内容,只是引用同一个数组。如果要克隆数组,请使用 Array.slice()

这是一个固定的函数:

var diceToRoll = [2,2],
    diceRolled = []; 

function recurse(diceToRoll, diceRolled) {      
    var roll = diceToRoll[0],
        diceLeftToRoll = diceToRoll.slice(1),
        loop,
        result;                 

    for(loop=1; loop<=roll; loop++) {    
        result = diceRolled.slice(0);                        
        result.push(loop);                      

        if(diceLeftToRoll.length === 0) {        
            console.log(result);    
            result.pop(); 
        } else {
            recurse(diceLeftToRoll, result);
        }
    }
}

recurse(diceToRoll, diceRolled);

注意

diceToRoll = diceToRoll.slice(1)

相当于

diceToRoll = diceToRoll.slice(0);
diceToRoll.shift();

在这里 fiddle :http://jsbin.com/isebef/1/edit

关于javascript - 我在用 JavaScript 编写递归函数时遇到问题 - 它似乎没有正确地将 "fall back"到更小的深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16635395/

相关文章:

algorithm - 编写一个程序来计算递归调用的次数

algorithm - 查找可能的替换列表

javascript - 将 div 的宽度设置为与其最近的兄弟相同

java - 返回 hashmap 对象而不是显式定义的 dto 实例(不好的做法?)

javascript - 更改元素高度在第二次按下时不起作用

java - 了解将数组切片为子数组的递归调用

recursion - 递归谓词在到达基本情况后继续

javascript - Sequelize : Error trying to nested association

javascript - 唯一选择选项值

javascript - JavaScript 中的递归调用不起作用?