QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 1284|回复: 0
打印 上一主题 下一主题

每个人都应该懂点函数式编程-转载

[复制链接]
字体大小: 正常 放大
回帖奖励 1 点体力 回复本帖可获得 1 点体力奖励! 每人限 1 次

413

主题

36

听众

1854

积分

升级  85.4%

  • TA的每日心情
    开心
    2019-9-18 21:55
  • 签到天数: 258 天

    [LV.8]以坛为家I

    社区QQ达人

    群组2015国赛冲刺

    群组2016美赛公益课程

    群组国赛讨论

    群组第三届数模基础实训

    群组Matlab讨论组

    跳转到指定楼层
    1#
    发表于 2015-11-20 22:36 |只看该作者 |倒序浏览
    |招呼Ta 关注Ta
    每个人都应该懂点函数式编程
    2015-08-27 11:47by 周见智
    目录

    Ø  一个问题
    假设现在我们需要开发一个绘制数学函数平面图像(一元)的工具库,可以提供绘制各种函数图形的功能,比如直线f(x)=ax+b、抛物线f(x)=ax2+bx+c或者三角函数f(x)=asinx+b等等。那么怎么设计公开接口呢?由于每种行数的系数(a、b、c等)不同,并且函数构造也不同。正常情况下我们很难提供一个统一的接口。所以会出现类似下面这样的公开方法:
    复制代码
    //绘制直线函数图像
    public voidDrawLine(double a, double b)
    {
        List<PointF> points = newList<PointF>();
        for(double x=-10;x<=10;x=x+0.1)
        {
            PointF p =new PointF(x,a*x+b);
            points.Add(p);
        }
        //将points点连接起来
    }
    //绘制抛物线图像
    public voidDrawParabola(double a, double b, double c)
    {
        List<PointF> points = newList<PointF>();
        for(double x=-10;x<=10;x=x+0.1)
        {
            PointF p =new PointF(x,a*Math.Pow(x,2)+ b*x + c);
            points.Add(p);
        }
        //将points点连接起来
    }
    ...
    DrawLine(3, 4);   //绘制直线
    DrawParabola(1, 2,3);    //绘制抛物线
    复制代码
    如果像上面这种方式着手的话,绘制N种不同函数就需要定义N个接口。很明显不可能这样去做。
    (注,如果采用虚方法的方式,要绘制N种不同函数图像就需要定义N个类,每个类中都需要重写生成points的算法)
    如果我们换一种方式去思考,既然是给函数绘制图像,为什么要将它们的系数作为参数传递而不直接将函数作为参数传给接口呢?是的,没错,要绘制什么函数图像,那么我们直接将该函数作为参数传递给接口。由于C#中委托就是对方法(函数,这里姑且不讨论两者的区别)的一个封装,那么C#中使用委托实现如下:


    每个人都应该懂点函数式编程.pdf

    511.77 KB, 下载次数: 14, 下载积分: 体力 -2 点

    详细内容

    zan
    转播转播0 分享淘帖0 分享分享0 收藏收藏1 支持支持0 反对反对0 微信微信
    数学中国版主团队!
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2025-5-21 14:34 , Processed in 0.595344 second(s), 54 queries .

    回顶部