参见英文答案 >
Variadic curried sum function11个
这是一个我尚未弄清楚的面试问题.考虑以下:
这是一个我尚未弄清楚的面试问题.考虑以下:
function recurse(a) { return function(b) { console.log(a + b); } } //This will log '5' in the console recurse(2)(3);
现在我被要求编写一个函数,它将获取n个参数,并通过记录参数值的最终总和以相同的方式工作.含义:
//This should log '13' recurse(2)(3)(1)(7)
如何编写这样的函数?我已经尝试过在递归,动态参数等方面进行思考.但是还没有能够记下任何具体的东西.
解决方法
这是我能想到的最简单的版本:
function add (a) { return function (b) { return b == null ? a : add(a+b); } } console.log( add(2)(3)() ); console.log( add(10)(100)(1000)(4)() );
在es6中,它很紧凑!
let add = a => b => b == null ? a : add(a+b);
注意
let result = add(2)(3);
相当于:
/*1*/ let partialResult = add(2); /*2*/ let result = partialResult(3);
在第1行中,add不知道是否使用最后一个参数调用它!换句话说,它不知道partialResult应该是一个数字,还是一个将用另一个参数调用的函数.
Nina Scholz为您提供了一个解决方案,其中partialResult在处理时像primitive一样表现得像一个数字,就像函数一样被调用时.在我的解决方案中,partialResult总是像一个函数一样,并在没有参数的情况下调用时返回一个sum.
第一种方法需要一种特定于语言的机制,以便在某些条件下“表现得像一个数字”.如果您的采访是关于JavaScript的,那么这是最好的近似值!但在语言不可知的背景下,你所要求的是不可能的.