当前位置: 主页 > 程序 >

C++实现add(1)(2)(3)

时间:2019-05-03  作者:haden   点击:
【摘要】Codewars 刷题记录
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



顶一下
(1)
100%
踩一下
(0)
0%
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
评价:
验证码: 点击我更换图片

推荐内容