Java漫談5
吳軍老師有在他的《矽谷來信》中分享過他對於人工智慧的看法,吳老師就認為,人工智慧不會發展成黑客帝國的那種恐怖境地,原因是當初科學家在創立計算機之前先把人類要解決的事情分成了兩類,一類是通過固定的步驟能得到答案的,另一類是無法通過確定的步驟得到準確答案的。而計算機的出現,就是為了提升解決前一種問題的效率和速度。
對於這種劃分,仁者見仁智者見智。不過,我們先假定這種分法的正確性,那麼,對計算機而言,它的出現,就是在替代人,做一些固定化流程的事情。比如從1+……+100這樣的活,雖然我們也有高斯公式可以不用繁瑣地一次次累加,但是儘管我們動用公式,也趕不上計算機累加的速度。而在這個累加的過程中,我們不會手動地每次都輸入值,而是告訴計算機,你要從多少開始累加,到多少的時候停止累加,而這個過程就是傳說中的流程控制。
所謂的流程控制,可以粗略地理解為,判斷與迴圈的排列組合。為什麼這麼說呢,還是回到之前的累加的功能上,先不管任何的程式設計語句,就僅僅對這個過程做一個簡單地抽象,我從哪個數開始加,加到哪個數的時候輸出。那麼把這個過程再整理一下就是,我需要判斷開始和結束的點,剩下的就交給迴圈解決。這其中,判斷歸判斷語句管理,迴圈歸迴圈語句管理。
再細化一下,如果就是求從1+…+100,那麼我們的任務可以拆分判斷什麼時候開始,判斷什麼時候迴圈,判斷什麼時候結束三部分。再細一步,就是從1開始,經過不斷迴圈,累加到100結束。所以一個簡單的for迴圈就此出現。大致如下
for(int i=1; i<101; i++){ //your code ... }
這裡的i就像一個旁觀者一樣,冷眼旁觀每一次的迴圈。但如果並不知道迴圈的次數,只知道迴圈體中的某一個變數本身就是一個判斷條件的時候,for迴圈的寫法就會顯得繁瑣,繁瑣有二,其一為for的無限迴圈表示方法比較變扭,其二為for迴圈裡面還要再套一層if判斷,其簡潔程度就不高了。就以喝水為例,我其實更加關心的是有沒有喝飽這個狀態,並不關心喝了幾次,於是,用for語句就會出現上面的兩個繁瑣,而用while語句則會顯得較為簡潔,具體如下:
//for迴圈描述 for(;;){ if(飽了麼){ break; }else{ 繼續吃(); } } //while迴圈描述 while(餓了麼){ 繼續吃(); }
你要是真的餓了一天的話,那麼肯定是看到飯想都不想就會先吃,然後再判斷有沒有吃飽,這個時候,while迴圈就要變成do-while迴圈,因為do-while與while剛好相反,第一次的時候不判斷,直接執行。程式碼如下:
do{
繼續吃();
}while(飽了麼);
不過就目前來看,for迴圈用的最多,while迴圈會在自定義定時器這種情況下用一下,do-while迴圈就用得更少了。除了一般的計數,累加這樣的重複性數學運算或者說是數學公式裡會用到之外,其餘用的多的是在集合中運用,那個時候,增強for迴圈會用得逐漸多起來,不過在那種情況下,for迴圈也是可以繼續用的。增強for迴圈我們在談到集合的時候再聊。此外,這只是我做到目前為止的遇到的比例,每個行業不同,比例也不同。根據自己的工作經驗整理出一套自己的概率排布才更重要。
今天我們聊了一下流程控制語句,希望能讓你對流程控制有一個新視角的理解,我們下回見。