对数字有兴趣的朋友可以看一下,应用到编程里更加有趣

  上贴重在体味逻辑的差别,这一贴我们举几个简单的数字问题,思考其中的逻辑和实现的方法,并感受其中的趣味。

  第一个例子:11123581321....C#递归写出算法,算出第30个数。

  乍一看,我们好像在哪儿见过。没错,我们确实见过,你记得吗,我叫斐波拉契数列,而且我还记得那一天你刚发芽。这个问题解决起来并不算难,我之所以提出来的原因是,其中会涉及到递归的思想fn=fn-1+fn-2[其中n>2],代码执行过程中也体现了计算机强大的存储和计算能力,这是人脑所不能及的(当然,这种逻辑还是人脑开发出来的),而且感觉有点完美契合的味道。

下面是实现的代码:

实际上运行也是没有问题的:

  是不是很有趣呢。我个人觉得九九乘法表也是很有意思的,代码简洁但不简单,for里面再嵌套一个for,要是在自己脑海里按计算机的执行顺序来运行一下这个项目,对初学者而言感觉还是烧脑的。代码在这里不再赘述,与之比较贴合的另一个实例就是冒泡排序。

  何为冒泡排序呢?举个例子,将以下四个数升序排列8625230。我们可以很直观地直接写出来,而计算机是没有这种宏观思维的,那么就需要我们来创造出一个能够让电脑理解逻辑。不妨来看看所谓冒泡的思路。先将首位和第二位的数比较,86>25,好,我们便把8625交换,现在的顺序是这样的2586230。接下来取数两两比较其实有很多种选择,只有按一定的规则往下选取,才能保证思维的逻辑性和科学性,避免遗漏和混乱的局面。好了,我们接着冒泡。取出居于首位的25和第三位的2比较,25>2,然后25晁盖把头把交椅让给2号人物宋江,现在座次为2862530。接下来当然是2<30,所以按兵不动。这样第一轮选举结束,也就形成了2是最小的数的局面,稳坐第一。第二轮就该到86开始比较了,显然他是没有必要再和2去比较了,直接从他的下一位(也就是第[2+1=3]位)开始比较,按这样的规律依次类推。细心的看官显然已经发现规律了,我要说的是位于最后一位[4]的数感觉像是轮空了一样,在他这里两两比较的循环已经结束啦,好气啊。下面我们看看实际的代码:

    这里有一点好玩的地方不得不提一下。就是两个数的位置互换,我们在人脑中是可以直接完成的,而电脑需要一个中间量来搭桥替换。逻辑上有一点像是我们小时候玩过的汉诺塔,还是比较有意思的。当然,运行结果也在预料之中的。如果需要比较的数的数量很庞大,其实我们人脑也需要这样一个严密和程序化的思维。

    渐入佳境的你,我们一起来看一下下面的这个例子:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?

    用排列组合的知识,我们很容易得出总共有4*3*2=24个符合要求的三位数(事实上四位数也是24个)。一般此类问题我们都是用占位分析法,这次计算机也不例外,只不过我们在排下一位时可以事先人为地剔除相同的数,而我的傻大个兄弟computer还是执着地要从百位开始,(也可以是从个位或者是十位开始),每一位从1开始遍历到4(第一轮遍历),按位数依次类推,遍历下一位(第二轮遍历)时遇到与上位不同的便保留继续下一位(第三轮遍历),遇到相同的便止中止该数继续往后邻的数遍历(第二轮遍历)。在第三轮遍历的时候,要和前面确定的两位比较,事实上可选择的空间只有剩下的两个数了,这个流程也就很好契合了4*3*2的算法基础了。看到这里你有没有头晕呢,数学是计算机的一类基础,看来此言不虚,而且计算机专业也是从数学分支出来的一个的方向,当然现在计算机和软件已经发展的很健壮了。下面是实现的代码,不妨按计算机的"思路"走一遍。
 

    看到循环里面嵌套着循环,还夹杂着判断,是不是感觉在走迷宫呢。多走几遍就能找到正确的路径了,正所谓柳暗花明,我在迷宫门口等你哦,这个夏天我们不见不散。

    事实上,我们从运行的结果也能看出代码执行的顺序,123,124

    相信对数学感兴趣的你,对编程也会很有兴趣的。今天就先睡了,好困。争取做一个不熬夜的小码哥。

posted on 2017-04-10 02:07  吾与曾参  阅读(160)  评论(1编辑  收藏  举报