写在前面
这是面试中问到的一个问题,明明很简单的递归,但是有些细节没做到,就思路是对的,但具体没实现成,因此,结束后又完善并实现了。
问题如下:
实现一个链式 add 函数,当其接收的参数个数大于等于 3 个的时候,就返回其结果,如果接收的参数不够 3 个时,就返回函数再次继续接收参数。
测试用例:
add(2,3,4) => 9
add(2)(3,4) => 9
add(2)(3)(4) => 9
add(2,3)(4,5) => 14
1. 解题方法
解决思路就是以参数的长度大于等于 3 为出口,当参数长度不足 3 时就返回一个函数,在该函数内再次调用 add 函数,调用的时候将之前的参数传递过去
function add(){
if(arguments.length >= 3){
let sum = 0
for(let i = 0; i < arguments.length; i++){
sum += arguments[i]
}
return sum
}
let last = arguments
return function(){
return add.apply(this, [...last].concat([...arguments]))
}
}
2. 注意要点
当时之所有没有实现出来有如下几点细节没有注意到:
- 调用函数想传递完整的 arguments 时,需要使用 fn.apply(this, […arguemnts])
- arguments 不能写在函数形参里,在非箭头函数内部直接获取,若写在了函数形参里就成了函数中第一个参数的变量名了,就只是代表一个形参了。
- 返回的函数中也要有返回值,递归函数都要有返回值。