这也是群内一位小伙伴提供的一道头条面试题,应该是前端面试的。大概描述下原题含义:

给出如下方法调用:

add(2,4,5) // 11add(2)(4,5) // 11add(2,4)(5) // 11add(2)(4)(5) // 11

请写出 add 函数具体的实现

观察下,一共三个数值,有两种情况...1. add 方法接受三个参数,直接返回结果2. add 也可能接受一个或两个参数,返回一个函数,将剩下的参数,继续进行一次或多次调用这里我用 JavaScript 来实现,既能返回函数,又能返回方法,其它语言真的不好弄。JavaScript 每个 function 函数都有个默认的 arguments 参数,从此着手,add 方法返回一个函数,将两个函数的参数合并,超过三个则返回结果,否则继续返回函数继续接受参数。

function add() {  let args = [...arguments];  function sumFun() {    args = args.concat([...arguments])    if (args.length >= 3) {      return args.reduce(((a, b) => a + b), 0)    }    return sumFun;  }  return sumFun();}console.log(add(2, 4, 5)) // 11console.log(add(2)(4, 5)) // 11console.log(add(2, 4)(5)) // 11console.log(add(2)(4)(5)) // 11

这里其实想考的是 currying 函数,也就是部分求值,其含义是给函数分步传递参数,每次传递参数后部分应用参数,并返回一个更具体的函数接受剩下的参数,这中间可嵌套多层这样的接受部分参数函数,直至返回最后结果。所以本题也可以创建一个高阶函数,接受一个 fun 和 总的参数个数,当方法参数个数小于总参数个数时,合并参数,继续调用,否则,调用给定 fun。

function fixCurry(fn, totalArgs) {  totalArgs = totalArgs || fn.length  return function recursor() {    return arguments.length < fn.length ? recursor.bind(this, ...arguments) : fn.call(this, ...arguments);  }}let add = fixCurry((a, b, c) => a + b + c);console.log('Add')console.log(add(2, 4, 5)) // 11console.log(add(2)(4, 5)) // 11console.log(add(2)(4)(5)) // 11console.log(add(2, 4)(5)) // 11let mul = fixCurry((a, b, c) => a * b * c);console.log('Multiple')console.log(mul(2, 4, 5)) // 40console.log(mul(2)(4, 5)) // 40console.log(mul(2)(4)(5)) // 40console.log(mul(2, 4)(5)) // 40

以上。

c++如何将两个if函数合并_设计一个 add 函数相关推荐

  1. R语言使用c函数将两个向量数据合并起来形成一个新的向量(to one long vector)

    R语言使用c函数将两个向量数据合并起来形成一个新的向量(to one long vector) 目录 R语言使用c函数将两个向量数

  2. 【C++练习】4.2假设国家银监局需要统计银行总的存款数量,请设计一个友元函数,用于统计三家银行的总存款量。

    假设国家银监局需要统计银行总的存款数量,请设计一个友元函数,用于统计三家银行的总存款量. /* 2. 假设国家银监局需要统计银行总的存款数量,请设计一个友元函数,用于统计三家银行的总存款量. */ # ...

  3. 两个list关联合并_算法分享---两个有序链表的合并(C语言)

    定义两个指针,分别指向两个链表的头结点,在两个链表都不为空时, 比较两个链表结点的值的大小. 若链表l1的节点大于l2的节点,则将l1的节点值赋值给l3.l1的指针指向下一个节点. 反之,则则将l2的 ...

  4. origin两个图层图例合并_利用origin软件将两个图形完美合并的方法

    科研中为了使图形传达出更大的信息量,有时也为了美观,往往需要将两个或更多的图形合并为一个图.origin软件可以很好的解决这个问题,下面以反映美国吸烟情况的两幅图为例进行说明如何利用origin软件将 ...

  5. oracle对某两列求和再求和_只会SUM函数求和,试试这5种求和函数,十倍提高工作效率...

    在平时的工作和学习中,求和计算算是比较司空见惯的数据统计方式,但大多数人只知道Sum函数可以用来求和,事实上,除了SUM函数,还有SUMIF.SUMIFS.SUBTOTAL.SUMPRODUCT.SU ...

  6. python函数实例化_用Python实例化函数

    python函数实例化 In terms of Mathematics and Computer science, currying is the approach/technique by whic ...

  7. access month函数用法_掌握时间智能函数,同比环比各种比,轻松搞定!

    时间可以说是数据分析中最常用的独立变量,工作中也常常会遇到对时间数据的对比分析.假设要计算上年同期的销量,在PowerBI中可以用CALCULATE来写个度量值[上年同期], = CALCULATE( ...

  8. mysql函数 游标_存储过程/游标/mysql 函数

    存储过程和函数(存储在 mysql数据库中的 proc表,所以检查有没有这个表) 存储过程是一种存储程序(如正规语言里的子程序一样),mysql支持有两种:存储过程,在其他SQL语句中可以返回值的函数 ...

  9. 用一个随机数函数去生成另一个随机数函数:rand(a)生成rand(b)以及rand(a,b) 生成rand(c,d)

    让我们把这个问题泛化一下,从特殊到一般.现在我给你两个生成随机数的函数Randa, Randb.Randa和Randb分别产生0到a的随机数和0到b的随机数,a,b不相等 (相等就没必要做转换了).现 ...

最新文章

  1. MongoDB(一):安装
  2. eclipse运行 Maven Test命令时控制台输出乱码的解决办法
  3. checkbox未赋值时获取value是on_C语言中的指针——指针的赋值和指向
  4. ptr = (char *)malloc(0)
  5. sublime_text3代码自动提示补全
  6. scp错误 WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
  7. caffe学习笔记25-过拟合原因及分析
  8. 使用@Async进行异步调用详解
  9. 对计算机基础知识的一点感想,浅议对《计算机应用基础》教学感想.doc
  10. Out of Browser 开篇
  11. adobe出的cookbook
  12. jQueryWEUI自定义对话框-带有textarea
  13. 如何在腾讯云搭建自己的网站
  14. SSM用户注册登录案例
  15. H5播放HLS之videojs播放视频
  16. 基于SQLite的信息管理系统
  17. c语言患者住院管理系统,住院系统-中小医院医疗套装软件管理系统_九明珠信息科技...
  18. [ARM入门]消失的飞思卡尔:MKV30 16位AD采集
  19. 一般各类模具开模周期
  20. 适合学计算机用的机械键盘,什么机械键盘好用2017 LOL职业玩家用什么键盘好

热门文章

  1. HDU 4635 Strongly connected
  2. Fiddler插件开发 - 实现网站离线浏览功能
  3. 网站移动版本开发踩坑实录二
  4. JavaSE 国际化 简单例子
  5. Flex 按钮添加图标
  6. c++ map的使用方法[转]
  7. 安装ArcGISServer9.3流程(DotNet版本)
  8. ActiveMQ消息中间件的作用以及应用场景
  9. CentOS 6上配置安装MariaDB,二进制文件,非源码
  10. Android编译系统入门(二)