C语言基础(三)之控制流

C语言控制流主要是顺序,分支,循环。这三种方式基本上是语言学上必须提供的三种方式,还有一种特殊的方式是在函数层面,就是递归。

本以为控制流部分其实没有什么好说的,三种基本控制方式都是显而易见的,但是,最近一直研究NFA,发现真是难懂,但是代码写出来就是基本的控制流组成的,后来又想起KMP算法,排序算法,发现这些都是基本控制流组成的。于是我猜想控制流不是简单的表面上的东西,这东西和算法是紧密相关的。

在没有展开说之前,我想说一句我一直以来觉得非常有哲学的一句话“计算机是简单的”!
你仔细想想,如果去除所有这些复杂逻辑,计算机本身就是一个电子与器件的组合,他能做的事情也是0 1 的输出。至于为什么有些人包括本人都觉得计算机学习来总是有障碍,主要的原因还是思维的方式问题。

我们很容易思考一个顺序执行过程的算法,比如说今天做什么,明天做什么,后天做什么等等。但是分支和循环,就很难理解了,尤其是循环和分支组合的时候。

首先我们要明白为什么我们很容易理解一个顺序过程的算法,因为这种思维方式是线性的,画个图就明白了

C语言基础(三)之控制流_第1张图片

熟悉线性表的同学肯定熟悉这样的结构。对于这样的结构我们还是很容易理解的。

如果单纯的是分支结构,我们也是很好理解的,因为分支结构虽然说是一种类似于树状的一种图状结构,但是单纯的某一个分支其实还是线性的结构。

C语言基础(三)之控制流_第2张图片

123, 124, 125 都是线性的,所以这个还好理解。这也符合我们的日常思维,比如说天气晴朗,我们去哪玩,天气不好,我们去哪玩!

循环结构的特点是迭代行为
C语言基础(三)之控制流_第3张图片

1212121, 从某种意义上说这是线性的执行过程,但是从形象化的表示可以看出只是一个具有回路的图。我们对于回路的逻辑思维是及其不擅长的。还记得1+2+…+100D的求和公式吗?为了解决这个求和问题,我们是不是还找了一些规律,用来简化计算。其实,对于计算机来说这就是一个迭代的加法操作的过程。计算机很容易解决这个问题,也不需要什么计算公式,我只要依据简单的加法规则,迭代执行加法操作就行了。所以当你的计算机老师说写一个1到N值求和的函数,你也不需要使用什么计算公式,你直接利用循环具有迭代这一特征就能很好的解决这个问题。
然而,还是我说的,我们及其不适应这种思考问题的方式,因为迭代的过程是个多步的线性过程,我们不知道这个多步执行的过程中前一个过程的状态值是多少,我们很难有一个确定性的输入,如果配合上分支结构, 这里的不确定性就更大了,但是,这对于计算机来说确实轻而易举的,不论你是什么执行方式,我都是一步一状态,我能很好的确定下一步执行之前,我的输入是个什么状态。
递归其实也是一种迭代,对于C语言递归的表现是基于函数的,迭代的变现是基于循环的。递归的难以理解的主要原因是递归中的过程的状态更是匪夷所思,不好理解。尾递归其实可以直接使用循环迭代实现。

顺序结构类似线性表,分支类似树形结构,循环类似图状结构
如果你学过数据结构,你就能明白为什么树形结构和图论那部分的内容那么难以理解,或者说不好理解,就是这个原因。

C语言针对这种现象还提供了continue,和break这两个关键词。一句话C语言这部分的内容表面上看起来很简单,但是他是对人类思维方式的一种挑战。其实这种思维方式才是最自然的,但是我们多年来一直学习数学,导致我们很难一步回归到这种自然性的行为上。多多练习才是正道!!!!

你可能感兴趣的:(总结性的文章)