Javascript 求和函数使用递归和多个参数

Javascript 求和函数使用递归和多个参数,javascript,math,recursion,Javascript,Math,Recursion,是否有一种方法可以创建一个既可以使用递归调用(例如(1)(2)(3)(4))又可以使用多个参数(例如(1,2,3,4))的求和函数 像这样: sum(5, 5) // 10 sum(5)(5) // 10 谢谢。您可以为下一个参数返回一个函数并实现一个方法 函数和(){ var add=函数(a,b){返回a+b;}, value=Array.prototype.reduce.call(参数,add,0); 函数f(){ value=Array.prototype.reduce.call(参

是否有一种方法可以创建一个既可以使用递归调用(例如(1)(2)(3)(4))又可以使用多个参数(例如(1,2,3,4))的求和函数

像这样:

sum(5, 5) // 10
sum(5)(5) // 10

谢谢。

您可以为下一个参数返回一个函数并实现一个方法

函数和(){
var add=函数(a,b){返回a+b;},
value=Array.prototype.reduce.call(参数,add,0);
函数f(){
value=Array.prototype.reduce.call(参数、add、value);
返回f;
}; 
f、 toString=function(){returnvalue;};
返回f;
}
控制台日志(总和(5,5));
控制台日志(总和(5)(5));

控制台日志(总和(3,4,5)(6,7))在函数式编程中,您要求的是基于currying的概念。Currying允许部分应用不确定数量的参数的函数。这意味着,一旦使用curry,它将接受一个参数存储该参数和操作,并返回另一个函数供您输入下一个参数

在一些语言中,如Haskell,这是所有函数的自然行为,但在JS中不是这样。然而,由于JS是一种“某种”函数式语言,它允许您传递和返回函数,因此,使用JS仍然是可以实现的

好的,让我们看看如何通用地使用多参数函数

函数和(n,m,o,p){//无载波标准函数
返回n+m+o+p;
}
函数curry(fn){//接受一个未载波函数并返回一个curry函数
返回函数(…a){
返回a.length>=fn.length?fn(…a)
:咖喱(fn.bind(fn,…a));
};
}
var csum=货币(总和);//现在csum是sum的咖喱版
console.log(csum(1,2,3,4));// 参考:

多亏了帕拉姆·辛格,他为无限变量currying问题提出了一个很好的解决方案

            function callFun(fn){

                const doTo = (args) => args.reduce((acc, a) => fn.call(fn, acc, a))

                const next =(...args)=>{
                    return (...innerArg)=> {
                        if(innerArg.length){
                            return next(...args, doTo(innerArg))
                        }else{
                            return doTo(args)
                        }
                    }
                }

                return next()    
            }

            const sum = callFun((a,b) => a + b)

            console.log(sum(1)(2)(3,2,1)())

是的,这是可能的。