遞迴與goto (轉)
遞迴與goto:namespace prefix = o ns = "urn:schemas--com::office" />
written by leezy_2000
記得剛開始學習C時,老師和教材都有明訓:“千萬不要亂用goto語句,否則將導致可讀性極度下降。但能夠極大提高地情況,可以考慮使用。”抱著不求有功,但求無過地心思,goto一度被我扔到了垃圾簍。後來隨著閱讀程式碼量地增加,我發現goto至少在兩個方面可起到改善程式地作用。一是出錯處理,二是用來模仿遞迴。用來做出錯處理,在某些特定的場合可以,增強閱讀性。用來模擬遞迴,可以極大的提高程式的,但無疑會降低程式的可讀性。這篇文章討論後者。
我們來看一段程式碼:
求n—0範圍內,所有整數的累加。
unsigned add( unsigned num)
{
if(num != 0) return num+add(num-1);
else return 0;
}
使用的時候有:
unsigned c=100;
cout<< add(c) < 這段程式簡單的很,就是用遞迴求解,沒什麼好說。當然效率不會高,尤其num比較大的時候。這種影響是由於過於頻繁的導致的。 現在我們來歸納一下這次遞迴呼叫的特徵: 1. 由於遞迴函式原型一致,所以堆疊中存放的資料型別一致。也就是相當於一個陣列。 2. 先壓棧,增長堆疊大小,達到某個臨界條件,開始出棧。並對出棧資料進行累加。出棧的次數當然同壓棧的次數一致。 為了降低函式呼叫對效能的影響,我們來模擬這個過程。看如下程式和註釋。 unsigned stack[100];//模擬堆疊,假設n為100 bool goback=false; //臨界條件 int i=0; //計數 int p=c; //p=100 int num=0; //和 //相當於遞迴函式的入口 recurse: if( p!=0)//進棧 { stack[i++] = p--; goto recurse; } else goback=true; //達到臨界條件了 //出棧,求和,從遞迴中返回 if( --i >=0 ) { num +=stack[i]; goto recurse; } 這樣實現,在空間和時間上都會有較佳的改善,當然前提是要用在恰當的地方。 最後說明一下,這個方法不是我發明的。Microsoft C/C++執行時庫中的qsort就是用這種辦法實現的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-987763/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 輸出1-100,不使用迴圈 goto 遞迴Go遞迴
- 演算法小專欄:遞迴與尾遞迴演算法遞迴
- 迭代與遞迴--你被遞迴搞暈過嗎?遞迴
- c# case多分去與跳轉gotoC#Go
- 【C++】翻轉二叉樹(遞迴、非遞迴)C++二叉樹遞迴
- C語言goto語句以及用goto語句構成迴圈C語言Go
- 遞迴和尾遞迴遞迴
- 揹包問題的遞迴與非遞迴演算法遞迴演算法
- 二叉樹的四種遍歷(遞迴與非遞迴)二叉樹遞迴
- 快速排序【遞迴】【非遞迴】排序遞迴
- 函式遞迴與生成式函式遞迴
- 遞迴在C++應用中的利與弊 (轉)遞迴C++
- 遞迴演算法轉換為非遞迴演算法的技巧遞迴演算法
- continue、break與gotoGo
- 10-17 c遞迴與遞推初識遞迴
- 遞迴轉非遞迴 棧模擬 Recursive to Non-recursive stack simulated 總結遞迴
- 遞迴遞迴
- python中的迭代與遞迴Python遞迴
- 遍歷二叉樹的遞迴與非遞迴程式碼實現二叉樹遞迴
- ACM(遞迴遞推—A)ACM遞迴
- 二十一、氣泡排序演算法——JAVA實現(遞迴與非遞迴)排序演算法Java遞迴
- 二叉樹——後序遍歷的遞迴與非遞迴演算法二叉樹遞迴演算法
- [java] 二叉樹的後序遍歷(遞迴與非遞迴實現)Java二叉樹遞迴
- 遞迴與分治演算法練習遞迴演算法
- Swift遞迴列舉與紅黑樹Swift遞迴
- ACM(遞迴遞推—I)ACM遞迴
- JavaScript遞迴JavaScript遞迴
- go 遞迴Go遞迴
- 理解遞迴遞迴
- 遞迴 Java遞迴Java
- 遍歷二叉樹-------遞迴&非遞迴二叉樹遞迴
- php陣列轉xml的遞迴實現PHP陣列XML遞迴
- FSO+遞迴生成檔案列表(xml) (轉)遞迴XML
- goto?Go
- 遞迴和遞推總結遞迴
- 資料結構與演算法:遞迴資料結構演算法遞迴
- c++遞迴與迭代實現漢諾塔C++遞迴
- 楊輝三角與陣列遞迴累加陣列遞迴