程序調用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種算法在程序設計語言中廣泛應用。 一個過程或函數在其定義或說明中有直接或間接調用自身的一種方法,它通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。遞歸的能力在於用有限的語句來定義對象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進段和遞歸返回段。當邊界條件不滿足時,遞歸前進;當邊界條件滿足時,遞歸返回。——摘自百度百科
void digui() { if(你不懂) digui(); if(你懂了) return hehe; }
void ditui() { if(你沒懂) ditui(); if(你懂了) cout<<"hehe"; }
怎么樣,用簡潔明快的方法就能讓你明白算法的真諦是不是很爽hhhhh
遞歸遞推作為基礎算法其實並不難,但還是有必要舉一些例題來看看= =
1.
小猴子第一天摘下若干桃子,當即吃掉一半,又多吃一個.第二天早上又將剩下的桃子吃一半,又多吃一個.以后每天早上吃前一天剩下的一半另一個.到第10天早上猴子想再吃時發現,只剩下一個桃子了.問第一天猴子共摘多少個桃子?
= =這踏馬其實就是一個口算題,放在這里只是為了加深算法印象
2.
有雌雄一對兔子,假定過兩個月便可繁殖雌雄各一的一對小兔子。問過n個月后共有多少對兔子?
這是著名的斐波那契數列= =遞推必刷題之一,當然還有很多關於這道題的難題,暫時不一一列舉
3.角谷定理。輸入一個自然數,若為偶數,則把它除以2,若為奇數,則把它乘以3加1。經過如此有限次運算后,總可以得到自然數值1。求經過多少次可得到自然數1。 如:輸入22, 輸出
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
STEP=16
= -簡單遞推不解釋。。。。
有人會問,要這么多水題來干嘛?我會說:水題不水永遠不知道這是水題= =
難題肯定有,只是太多太常見,找UVA隨便打幾個數就是一堆= -
由於本次算法簡單粗暴,所以詳解略少,整理動態規划的時候我會再搞出來一點遞推的東西。