欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

C語言的while循環(huán)語句怎么理解

榮姿康2年前16瀏覽0評論

C語言的while循環(huán)語句怎么理解?

謝邀。

我的上一個回答介紹了C語言的 “遞歸函數(shù)”,一行一行利用遞歸寫出了求 n! 的C語言程序并分析了它的執(zhí)行流程。

其實,每次遞歸調(diào)用都是在重復(fù)做同樣一件事,都是計算 n x (n-1)!。當(dāng)然了,雖說是“同樣一件事”,還是略有不同的(n的值每次都不同),所以稱呼其為“迭代”更恰當(dāng)一點。

計算機特別擅長處理重復(fù)迭代的工作,這也是我們?nèi)祟愂褂糜嬎銠C的原因之一,因為人類最不擅長,也不喜歡重復(fù)迭代的工作。有了計算機,程序員通過編程告訴計算機怎樣做就可以了。

C語言中的 while 循環(huán)語句

雖然迭代用遞歸可以解決,但是C語言的循環(huán)語句更符合我們?nèi)祟惖氖褂昧?xí)慣,用起來更習(xí)慣,我們先來看看 C語言中的 while 語句。它的語法為:

while(條件表達(dá)式){ 語句;}

到達(dá) while 語句時,程序會判斷“條件表達(dá)式”的真假,若假則跳過 while 語句塊。若真,則執(zhí)行 while 語句塊里的內(nèi)容,到達(dá)語句塊末尾時,程序會回到“條件表達(dá)式”處,再次判斷真假。

現(xiàn)在知道了 while 循環(huán)語句的用法,我們來用它計算 n 的階乘,C語言代碼可以如下寫:

上面的C語言代碼和之前利用遞歸求階乘的代碼,從某種程度上來說,是等價的。我們?nèi)匀灰?factorial(3) 為例,說說這段C語言代碼的執(zhí)行流程。

程序第一次到達(dá) while 處,n=3,顯然大于 0,于是 result=1 x 3,接著 n=2;回到 while 處,n 依然大于 0,于是 result = 1 x 3 x 2;接著 n=1,回到 while 處,n 依然大于 0,于是 result = 1 x 3 x 2 x 1,接著 n = 0;回到 while 處,0 不大于 0,于是跳過 while 語句,factorial 函數(shù)返回 result = 6。

很多程序員習(xí)慣稱呼 n 為循環(huán)變量,因為它控制著循環(huán)體是循環(huán)還是結(jié)束。

C語言的循環(huán)和遞歸

我在上一個回答中提到“遞歸和循環(huán)是常常是等價的”,這里就是一個例子。

但是要注意的是,遞歸和循環(huán)解決問題的思路不一樣,用遞歸解決階乘問題靠的是遞推關(guān)系n!=n·(n-1)!,用循環(huán)解決這個問題則更像是把這個公式展開了:n!=n·(n-1)·(n-2)·…·3·2·1。

把公式展開了理解會更直觀一些,所以有些時候循環(huán)程序比遞歸程序更容易理解。

在整個遞歸調(diào)用過程中,雖然分配和釋放了很多變量,但是所有的變量都只在初始化時賦值,沒有任何變量的值發(fā)生過改變,而上面的循環(huán)程序則是通過對n和result這兩個變量多次賦值來達(dá)到同樣目的的。

再來說說使用 while 的注意事項

既然“遞歸和循環(huán)常是等價的”,而遞歸函數(shù)如果寫的不恰當(dāng)就會造成無限遞歸,導(dǎo)致程序最后崩潰,那對應(yīng)的,while 循環(huán)語句如果寫的不恰當(dāng),也會造成無限循環(huán),程序員們常常稱其為“死循環(huán)”。

造成 while 語句死循環(huán)的原因很簡單,只要 while 的條件表達(dá)式不可能為假,程序跳不出 while 循環(huán),就會導(dǎo)致C語言程序陷入“死循環(huán)”。

上面的C語言代碼例子中,正整數(shù) n 不斷減 1,最后 n 必定會等于 0 的,因此 n>0 有為假的時刻,所以不會導(dǎo)致死循環(huán)。

但是,如果不小心把 n = n-1 這條語句漏掉了,那程序永遠(yuǎn)都不會跳出 while 循環(huán)體了。

不過與無限遞歸不同,程序一般不會因為死循環(huán)崩潰,而是會“卡死”在死循環(huán)處。所以,在使用 while 循環(huán)語句之前,要確保 while 的條件表達(dá)式有機會為假,除非,你故意希望有一個死循環(huán)。

不過,有時候死循環(huán)并不是那么一目了然的,例如下面這個著名的 3x+1 問題:

循環(huán)體所做的事情是:如果n是偶數(shù),就把n除以2,如果n是奇數(shù),就把n乘3加1。一般的循環(huán)變量要么遞增要么遞減,可是這個例子中的n一會兒變大一會兒變小,最終會不會變成1呢?

可以找個數(shù)試試,例如一開始n等于7,每次循環(huán)后n的值依次是:7、22、11、34、17、52、26、13、40、20、10、5、16、8、4、2、1。最后n確實等于1了。

許多世界難題都是這樣的:描述無比簡單,連小學(xué)生都能看懂,但證明卻無比困難。

讀者可以再試幾個數(shù)都是如此,但無論試多少個數(shù)也不能代替證明,目前世界上還無人能證明。

歡迎在評論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語言、linux等嵌入式開發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。