gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 14:56:47 25 4
gpt4 key购买 nike

            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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com