C語言基礎(三)之控制流

C語言控制流主要是順序,分支,循環。這三種方式基本上是語言學上必須提供的三種方式,還有一種特殊的方式是在函數層面,就是遞歸。

本以爲控制流部分其實沒有什麼好說的,三種基本控制方式都是顯而易見的,但是,最近一直研究NFA,發現真是難懂,但是代碼寫出來就是基本的控制流組成的,後來又想起KMP算法,排序算法,發現這些都是基本控制流組成的。於是我猜想控制流不是簡單的表面上的東西,這東西和算法是緊密相關的。

在沒有展開說之前,我想說一句我一直以來覺得非常有哲學的一句話“計算機是簡單的”!
你仔細想想,如果去除所有這些複雜邏輯,計算機本身就是一個電子與器件的組合,他能做的事情也是0 1 的輸出。至於爲什麼有些人包括本人都覺得計算機學習來總是有障礙,主要的原因還是思維的方式問題。

我們很容易思考一個順序執行過程的算法,比如說今天做什麼,明天做什麼,後天做什麼等等。但是分支和循環,就很難理解了,尤其是循環和分支組合的時候。

首先我們要明白爲什麼我們很容易理解一個順序過程的算法,因爲這種思維方式是線性的,畫個圖就明白了

這裏寫圖片描述

熟悉線性表的同學肯定熟悉這樣的結構。對於這樣的結構我們還是很容易理解的。

如果單純的是分支結構,我們也是很好理解的,因爲分支結構雖然說是一種類似於樹狀的一種圖狀結構,但是單純的某一個分支其實還是線性的結構。

這裏寫圖片描述

123, 124, 125 都是線性的,所以這個還好理解。這也符合我們的日常思維,比如說天氣晴朗,我們去哪玩,天氣不好,我們去哪玩!

循環結構的特點是迭代行爲
這裏寫圖片描述

1212121, 從某種意義上說這是線性的執行過程,但是從形象化的表示可以看出只是一個具有迴路的圖。我們對於迴路的邏輯思維是及其不擅長的。還記得1+2+…+100D的求和公式嗎?爲了解決這個求和問題,我們是不是還找了一些規律,用來簡化計算。其實,對於計算機來說這就是一個迭代的加法操作的過程。計算機很容易解決這個問題,也不需要什麼計算公式,我只要依據簡單的加法規則,迭代執行加法操作就行了。所以當你的計算機老師說寫一個1到N值求和的函數,你也不需要使用什麼計算公式,你直接利用循環具有迭代這一特徵就能很好的解決這個問題。
然而,還是我說的,我們及其不適應這種思考問題的方式,因爲迭代的過程是個多步的線性過程,我們不知道這個多步執行的過程中前一個過程的狀態值是多少,我們很難有一個確定性的輸入,如果配合上分支結構, 這裏的不確定性就更大了,但是,這對於計算機來說確實輕而易舉的,不論你是什麼執行方式,我都是一步一狀態,我能很好的確定下一步執行之前,我的輸入是個什麼狀態。
遞歸其實也是一種迭代,對於C語言遞歸的表現是基於函數的,迭代的變現是基於循環的。遞歸的難以理解的主要原因是遞歸中的過程的狀態更是匪夷所思,不好理解。尾遞歸其實可以直接使用循環迭代實現。

順序結構類似線性表,分支類似樹形結構,循環類似圖狀結構
如果你學過數據結構,你就能明白爲什麼樹形結構和圖論那部分的內容那麼難以理解,或者說不好理解,就是這個原因。

C語言針對這種現象還提供了continue,和break這兩個關鍵詞。一句話C語言這部分的內容表面上看起來很簡單,但是他是對人類思維方式的一種挑戰。其實這種思維方式纔是最自然的,但是我們多年來一直學習數學,導致我們很難一步迴歸到這種自然性的行爲上。多多練習纔是正道!!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章