JavaScript中如何重复调用作为参数传入的函数而非存为常量?
解决递归调用传入函数的问题
嘿,我来帮你把这个骰子统计的逻辑捋顺!你的思路没问题,但代码里有两个关键小问题需要修正,才能实现每次递归都重复调用传入的骰子函数,而不是错误地比较函数本身:
原代码的核心问题
- 你直接在比较
function1和function2这两个函数对象,而不是调用它们获取骰子点数(比如应该是function1()而不是function1) - 两个骰子函数里的
values.length是笔误,应该对应各自数组的length(比如die.length和falseDie.length)
修正后的完整代码
// 真实骰子:返回1-6的随机数 function rollDie() { var die = [1, 2, 3, 4, 5, 6]; return die[Math.floor(Math.random() * die.length)]; } // 作弊骰子:大概率返回1或4 function rollFalseDie() { var falseDie = [1, 1, 4, 4, 4, 4]; return falseDie[Math.floor(Math.random() * falseDie.length)]; } // 递归统计n次投掷中真实骰子点数大于作弊骰子的次数 function rollDiceNTimes(function1, function2, n) { if (n > 0) { // 关键:每次递归都调用传入的函数,获取最新的骰子点数 const result1 = function1(); const result2 = function2(); if (result1 > result2) { // 满足条件则计数+1,继续递归剩余次数 return 1 + rollDiceNTimes(function1, function2, n - 1); } else { // 不满足则直接递归剩余次数 return rollDiceNTimes(function1, function2, n - 1); } } // 次数耗尽,返回总计数 return 0; }
逻辑说明
- 每次进入递归时,我们都会主动调用
function1()和function2(),这样每次都能得到全新的随机骰子结果,而不是复用之前的值 - 递归时仍然传递函数本身(
function1和function2),这样下一次递归依然可以调用它们获取新结果 - 修正了数组长度的笔误,避免出现
values未定义的错误
举个使用例子:
// 统计投掷100次的结果 console.log(rollDiceNTimes(rollDie, rollFalseDie, 100));
内容的提问来源于stack exchange,提问作者Yoge Yin
相关产品推荐
相关产品推荐

