You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:19:05