躺了一会,回忆以前看过的一些描述"原本"的知识,突然想到简单的数学运算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",其实含义已经更广泛了