Codewars 刷题记录 题目翻译: 构造一个函数,实现一连串数字的加和。
add(1)(2); // return 3
add(1)(2)(3)(4); //return 10
add(1)(2)(3)(4)(5); //return 15
只有一次调用应该返回传入值。
add(1); //return 1
还要求可以保存结果。
var addTwo = add(2);
addTwo; //return 2
addTwo + 5; // 7
addTwo(3); //5
addTwo(3)(5); //10
先来看看js如何做的(不会JS的可以跳过) 一般来说 fn()()这样的格式是会报错的,要想这个函数能执行 add()(),可以很快的想到当add()返回一个函数时,可以达到这样的效果。
function add(){
function temp(){}
return temp;
}
然后返回tmp保证了第二次调用的是tmp函数,后面的计算都是在调用tmp, 因为tmp也是返回的自己,保证了第二次之后的调用也是调用tmp,而在tmp中将传入的参数与保存在作用链中x相加并付给sum,这样就保证了计算;
function add(x){
var sum=x;
function temp(y){
console.log("y:"+y);
sum+=y;
console.log(sum)
}
return temp;
}
这样返回temp的话就不能够获取到sum的数值了,而我们又知道,当打印时,会调用他的tostring或valueof 方法 ,因此我们可以自己改写它的tostring方法,从而获得sum值。
function add(x){
var sum=x;
function temp(y){
console.log("y:"+y);
sum+=y;
return temp;
}
temp.toString=function(){
return sum;
}
return temp;
}
C++实现 顺着JS的思路,答案如下:
class Yoba
{
public:
Yoba(int n) : _n(n) {}
Yoba operator() (int n) { return Yoba(_n + n); }
bool operator== (int n) { return _n == n; }
int operator+ (int n) { return _n + n; }
int operator- (int n) { return _n - n; }
friend bool operator== (int n, const Yoba & y) { return n == y._n; }
private:
int _n;
};
auto add(int n)
{
return Yoba(n);
}
js代码:https://www.cnblogs.com/xiaofuxuan-blogs/p/9061151.html 补充柯里化:https://segmentfault.com/a/1190000008610969 |