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

如何在JavaScript中实现multipliedResult(3)(4)(5)返回60?是否需递归?

实现支持链式调用的乘法函数 multipliedResult

要实现 multipliedResult(3)(4)(5) 返回60,本质上是要写一个柯里化(Currying)函数——也就是每次调用后返回一个新的函数,直到完成所有参数的收集后再计算最终结果。

一、针对固定三次调用的简单实现

如果只需要支持三次链式调用,其实不需要递归,直接嵌套返回函数就行:

function multipliedResult(a) {
  return function(b) {
    return function(c) {
      return a * b * c;
    }
  }
}

// 测试:
console.log(multipliedResult(3)(4)(5)); // 输出60

这种写法很直观,每一层函数接收一个参数,最后一层计算乘积返回结果。

二、支持任意次数链式调用的通用实现(递归版)

如果希望函数能支持任意次数的调用(比如 multipliedResult(2)(3)(4) 返回24,multipliedResult(1)(2)(3)(4)(5) 返回120),那递归就是更优雅的方案:

function multipliedResult(num) {
  // 定义内部递归函数,保存当前累计的乘积
  function multiplyNext(nextNum) {
    num *= nextNum;
    return multiplyNext;
  }

  // 重写toString方法,当函数被隐式转换为字符串时返回最终乘积
  multiplyNext.toString = function() {
    return num;
  };

  return multiplyNext;
}

// 测试:
console.log(multipliedResult(3)(4)(5)); // 输出60
console.log(multipliedResult(2)(3)(4)); // 输出24

这里的原理是:

  • 每次调用函数时,都会更新累计的乘积,然后返回自身(递归的核心)
  • 当最后需要输出结果时,JavaScript会隐式调用函数的toString方法,我们重写这个方法来返回最终的乘积

三、非递归的通用实现(利用闭包保存状态)

如果你不想用递归,也可以用闭包维护累计值,结合函数的隐式转换来实现:

function multipliedResult(initial) {
  let total = initial;
  
  const fn = function(next) {
    total *= next;
    return fn;
  };

  fn.toString = () => total;
  return fn;
}

// 测试同样有效:
console.log(multipliedResult(3)(4)(5)); // 60

总结

  • 如果只是满足固定三次调用的需求,不需要递归,嵌套返回函数即可;
  • 如果要支持任意次数的链式调用,递归是很自然的实现方式,当然也可以用闭包维护状态的非递归方案。

内容的提问来源于stack exchange,提问作者Nandish

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:04:22