躺了一会,回忆以前看过的一些描述"原本"的知识,突然想到简单的数学运算1+1=2,在程序设计里的原本是什么呢,想到这里,不睡了,按照前人的指引,我也来探索一下阿

(以下代码使用C#4.0,未使用LINQ,其他语言可以找对应的语法)

直接写下最直接的代码如下

这就是1+1=2,没错!这个子程序很具体,专门解决这个问题!

对1+1=2进行一般化,变成a+b=c,是的,"+"的含义不就是这样吗?OK,演变成下面这样:

这样能解决的问题比上一步要宽泛的多了,不是吗?

问题:a+b+c=d?或者a+b+c+....=X?

"+"不局限于表示两个数相加,而是表示对N个数进行"求和",问题域又扩大了一点.那就往下写吧:

现在可以对任意多个数进行"+",而不是局限于a+b=c的形式了,更加接近"原本"了,呵呵    参数类型为List<int>?这里有点疑问,仅限列表,数组不行?队列不行?栈不行?。。。按道理来说,可枚举的一串数字应该都能求和啊,修改如下:

没问题了,这样要通用多了。    又想到一个问题:"+"就是一个二元操作符号,那么同样作为二元操作符的"减","乘","除"等是否有更一般的形式呢?    是的,考虑如下描述:对一个整数的集合从头至尾都进行一次操作(加减乘除。。。)并且得到操作结果。何谓二元操作?a+b=c,a*b=c,a/b=c他们的共同形式就是输入两个操作数,运算以后返回一个新的操作数,这里用C的语法来描述会更容易理解,满足型如 typedef int (*OP)(int a,int b)的函数都可以称作二元操作,对应C#里的形式就是Func<int a,int b,int c>的表达式。OK,演变成下面这样:

测试代码如下:

一切正常,:)    遗憾的是,这个表示法只能针对整数,这可不是好现象,我希望小数,甚至是字符串也能用于这种表示法,想一想:把一串地址加到一起,如下:"中国"+"湖南"+"张家界"="中国湖南张家界",这过分吗?NO,很自然。    那就要对"类型"进行通用化了,大家都知道,对"类型"编程,有一个术语叫"元编程",虽然C#的元编程不强,但是解决目前的问题够了,写出下面的版本:

测试代码如下:

很神气吧!

新问题又来了,二元操作并没有定义返回值和操作数都是一个类型阿,甚至操作数也没有定义必须是一个类型啊!!!需要得到整数的结果,"100"+"50"+"30"=180,这也没有说不过去吧。

演变成如下:

测试如下:

回顾一下二元操作符的定义,目前是不是更接近它原本的含义?虽然方法名还是叫"Sum",其实含义已经更广泛了

探索"+"的原本的更多相关文章

  1. 【探索】机器指令翻译成 JavaScript

    前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...

  2. 探索c#之递归APS和CPS

    接上篇探索c#之尾递归编译器优化 累加器传递模式(APS) CPS函数 CPS变换 CPS尾递归 总结 累加器传递模式(Accumulator passing style) 尾递归优化在于使堆栈可以不 ...

  3. 自定义样式的select下拉框深入探索

    第一个版本: 首先实现自定义select下拉框应该具有的功能,我是选择将原来的select隐藏掉,自己在jquery代码中动态写进去<dl><dd><dt>这样的结 ...

  4. 深入探索AngularJS(持续更新)

    数据双向绑定并不是Angular最出彩的地方.大部分对AngularJs的介绍都偏重于使用,使用的学习只是学了AngularJs的API,而那只能AngularJs的很小一部分.随着使用越来越深,系统 ...

  5. Swift 性能探索和优化分析

    本文首发在 CSDN<程序员>杂志,订阅地址 http://dingyue.programmer.com.cn/. Apple 在推出 Swift 时就将其冠以先进,安全和高效的新一代编程 ...

  6. [转]struct 用法深入探索

    struct用法深入探索 作者: Cloudward 1. struct的巨大作用 面对一个人的大型C/C++程序时,只看其对struct的使用情况我们就可以对其编写者的编程经验进行评估.因为一个大型 ...

  7. Android开发艺术探索第五章——理解RemoteViews

    Android开发艺术探索第五章--理解RemoteViews 这门课的重心在于RemoteViews,RemoteViews可以理解为一种远程的View,其实他和远程的Service是一样的,Rem ...

  8. Android开发艺术探索——第二章:IPC机制(上)

    Android开发艺术探索--第二章:IPC机制(上) 本章主要讲解Android的IPC机制,首先介绍Android中的多进程概念以及多进程开发模式中常见的注意事项,接着介绍Android中的序列化 ...

  9. Android开发艺术探索笔记——第一章:Activity的生命周期和启动模式

    Android开发艺术探索笔记--第一章:Activity的生命周期和启动模式 怀着无比崇敬的心情翻开了这本书,路漫漫其修远兮,程序人生,为自己加油! 一.序 作为这本书的第一章,主席还是把Activ ...

随机推荐

  1. java removeAll和重写equals、hashcode引起的性能问题

    问题背景: 上周发现了一个spark job的执行时间从原来的10-15分钟延迟到了7个小时!wtf,这是出了什么事引起了这么大的性能问题!! 立马查看job的运行日志,发现多次运行都是在某一个固定的 ...

  2. UVA 10886 Standard Deviation

    https://vjudge.net/problem/UVA-10886 计算标准差 碰到这种题将式子展开 #include<cmath> #include<cstdio> / ...

  3. 常见的Shell

    上面提到过,Shell是一种脚本语言,那么,就必须有解释器来执行这些脚本. Unix/Linux上常见的Shell脚本解释器有bash.sh.csh.ksh等,习惯上把它们称作一种Shell.我们常说 ...

  4. 使用shell脚本往文件中加一列

    上午大学同学问了我一个脚本的问题,大概需求就是看到所有端口的开启情况,还要知道每个端口的应用程序路径,而且要和之前的数据齐平,就是再加一列数据.我腚眼一看,非常容易嘛,但由于当时忙,所以就说中午给他发 ...

  5. Android开发——为移动的Paint元素指定图片的方法

    源  起 最近在写一个类似“围住神经猫”的应用,现在需要给一个可以移动的Paint元素指定一张图片,如下图,要把黄点改成其他图片: Paint所在的类继承于SurfaceView,SurfaceVie ...

  6. Item27--优先考虑泛型方法

    类型推导:发生在以下三个地方.1.Java编译器根据泛型方法传入的参数,推导出具体的类型.2.Java编译器,根据泛型构造器传入的类型来推导出实际要构造的实例类型.3.Java编译器根据表达式的目标类 ...

  7. 取石子游戏 HDU2516(斐波那契博弈)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2516 题目: Problem Description 1堆石子有n个,两人轮流取.先取者第1次可以取任 ...

  8. Windows Server 2008 R2 SP1安装SQL 2012安装报错之0x858C001B

    使用Windows Server 2008 R2 SP1安装SQL 2012的时候总是报这样一个错: SQL Server Setup has encountered the following er ...

  9. 设计模式之Builder

    设计模式总共有23种模式这仅仅是为了一个目的:解耦+解耦+解耦...(高内聚低耦合满足开闭原则) 介绍: Builder模式是一步一步创建一个复杂的对象,它允许用户可以只通过指定复杂对象. 将一个复杂 ...

  10. 上传漏洞新姿势(限Linux)

    服务器:Linux当前环境:nginx/1.4.7PHP版本:PHP Version 7.0.0  上传情况简介:上传  111.jpg111 确实可以成功的但是上传  1.php.jpg1111.1 ...