本文將詳細介紹在c++中的遞迴.
定義:遞迴是乙個函式呼叫它自身的過程,但由於可能會有無限次的呼叫,棧可能會溢位,所以遞迴必須要有終止條件.
在c++中,遞迴分為兩種型別:
每一種分類可以細分為以下5種型別
該遞迴最常用,它通過一種簡單的方式呼叫自己,並通過乙個終止條件終止自身.這個呼叫過程稱之為「纏繞(winding)」,當函式返回給呼叫者時稱之為「解除纏繞(un-winding)」。遞迴終止條件是我們已知的基礎條件.
例子:計算階乘
int fact(long n)
}
二分遞迴是乙個函式一次呼叫兩次而不是一次呼叫一次的過程。
它主要用於資料結構中,如樹的遍歷、查詢高度、合併等操作。
例子:斐波那契數列
int fibnum(int n)
函式相互呼叫。
假設funa呼叫funb, funb遞迴呼叫funa。
這實際上不是遞迴的,但它和遞迴是一樣的。
所以你可以說不支援遞迴呼叫的程式語言,相互遞迴可以應用在那裡來滿足遞迴的要求。
基本條件可以應用於任意乙個或多個函式或所有函式。
例子:判斷偶數或者奇數
bool isoddnumber(int n)
bool isevennumber(int n)
它和所有遞迴非常不同。
除巢狀遞迴外,所有遞迴都可以轉換為迭代(迴圈)。
你可以通過阿克曼函式的例子來理解這個遞迴。
int ackermann(int x, int y)
// error handling condition
if (x < 0 || y < 0)
// recursive call by linear method
else if (x > 0 && 0 == y)
// recursive call by nested method
else
}
無限分類 遞迴
在所有欄目 地區等 下拉列表中,這個類非常好用。具有這個結構的陣列,不是這樣的話,可以改類的實現 list array 1 array id 1 pid 0,name 一級欄目一 2 array id 2 pid 0,name 一級欄目二 3 array id 3 pid 1,name 二級欄目一 ...
無限極分類,遞迴分類
有一組陣列如下 items array 1 array id 1,pid 0,name 江西省 2 array id 2,pid 0,name 黑龍江省 3 array id 3,pid 1,name 南昌市 4 array id 4,pid 2,name 哈爾濱市 5 array id 5,pid...
thinkphp無限遞迴查詢分類
遍歷父id下所有資料 function getson parent id 0,t 1 return temp if session uid 1 if empty data return temp 看上面的while迴圈,當while迴圈完成以後,告訴我 data這個二維陣列裡面存的是什麼?當然是乙個...