字节前端原题(Add sumOf)

正文

这题的规则是这样的

给定有一个 Add 函数,要支持以下形式的调用

Add(1)(2)(3).sumOf(); // 输出 6

Add(1,2)(3)(4).sumOf(); // 输出 10

Add(1,2,…)(3)(4)(…).sumOf();  // …

拿到这种题目,我先来说说我自己的做题流程,一般会去找它最简单的形态。我们一步一步来拆解。

先去掉 sumOf() 变成了以下形态

Add(1,2,…)(3)(4)(…)

嗯…有点熟悉…但是还是有点复杂,那我们再去掉无限调用这个限制。

Add(1,2,…)(3)(4)

唔,还是有点难呀…没关系,再砍, 不要传入多个参数。

Add(1)(2)(3)

有…有…有那味了…这…这不就是柯里化吗…

有些小朋友可能没有听过,对于大朋友而言耳熟能详,融会贯通。

我们还是来介绍一下。

在《javascript高级程序设计》这本书中有如下介绍:

与函数绑定紧密相关的主题是函数柯里化,它用于创建已经设置好的一个或者多个参数的函数。函数柯里化的基本方法和函数绑定是一样的:使用一个闭包返回一个函数。两者的区别在于,当函数被调用时,返回的函数还需要设置一些传入的参数。

我们来写写看:

function Add(x) {

return function (y) {

return return functio (z) {

return x + y + z;

}

}

}

// 简洁写法

const Add = x => y => z => x+y+z;

执行一下

Add(1)(2)(3) // 6

是我们要的那味~

那么我们既然已经写出了这个形态,我们就一步一步反推。

这个时候千万别紧张,我们从最低级的形态出发,写出一个最基本的形态,能够有效地帮助我们建立自信心,吃下定心丸,按照这种方式,哪怕我们最终没有写出完美的结果,让面试官看到你思考解题的过程,也是一种加分。

好,接着说~

那我们接下来需要实现这个样子。

Add(1,2,…)(3)(4)

传入参数不止一个

我们知道,对于不确定参数个数,我们可以使用 arguments 这个对象来获取到所有的入参,但是 arguments 不是一个 Array,但是我们可以使用 ES6 中的 Spread syntax展开语法)去将他变成一个数组。表演继续。

function Add() {

const nums = […arguments];

return function() {

nums.push(…arguments);

return function() {

nums.push(…arguments);

return nums.reduce((a, b) => a + b);

}

}

}

nice!已经离我们最终的形态越来越近了。接下来是这个函数能够无限的进行调用。

Add(1,2,…)(3)(4)(…)

那么怎么样才能无限调用呢?没错,用递归。

function Add() {

const nums = […arguments];

function AddPro() {

nums.push(…arguments);

return AddPro;

}

return AddPro;

}

嗯,其实我们写到这里发现了… 由于是无限递归,我们没办法确定最后一次函数调用,因此我们需要最后显式调用一个结束的方法来打印出最后的数据。

很自然地,我们可以在 AddPro 添加一个方法 sumOf 来解决这个问题。

学弟就是卡在这里地方,被函数添加上一个方法搞懵了。你是否知道呢?

function Add() {

const nums = […arguments];

function AddPro() {

nums.push(…arguments);

return AddPro;

}

AddPro.sumOf = () => {

return nums.reduce((a, b) => a + b);

}

return AddPro;

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》

前端面试题宝典

前端校招面试题详解

}

return AddPro;

最后

整理面试题,不是让大家去只刷面试题,而是熟悉目前实际面试中常见的考察方式和知识点,做到心中有数,也可以用来自查及完善知识体系。

《前端基础面试题》,《前端校招面试题精编解析大全》,《前端面试题宝典》,《前端面试题:常用算法》

[外链图片转存中…(img-znZMIHx5-1718862097301)]

[外链图片转存中…(img-RE9DVUHh-1718862097302)]

[外链图片转存中…(img-6veq0QcD-1718862097303)]

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值