遞迴指的是在方法內部對方法自身呼叫;遞迴一般用於一些常見的演算法的解決,在實際應用中,
比如對資料夾內部檔案的遞迴檢索;以及樹形選單的顯示;遞迴是對迴圈的一種補充 。
遞迴,就是在執行的過程中呼叫自己。
構成遞迴需具備的條件:
1. 子問題須與原始問題為同樣的事,且更為簡單;
2. 不能無限制地呼叫本身,須有個出口,化簡為非遞迴狀況處理。
經典的遞迴問題:
有100個人圍成乙個圈(編號0-99),從第0號的人開始從1報數,凡報到3的倍數的人離開圈子,然後再數下去,
直到最後只剩乙個人為止,問此人原來的位置是多少號?
public
static
void
main
(string[
] args)
//初始化圈中的總人數
int len = b.length;
//宣告計數器,統計是否到達3
int count =0;
//初始化索引,記錄當前數到圈中的位置
int index =0;
//開始迴圈報數
while
(len >1)
}//陣列索引遞增
index++;if
(index == b.length)
}//迴圈判斷,陣列中為true的元素的位置(即為剩下的人原來的位置)
for(
int i =
0;i}
話說大詩人李白,一生好飲。幸好他從不開車。
一天,他提著酒壺,從家裡出來,酒壺中有酒2鬥。他邊走邊唱:
無事街上走,提壺去打酒。
逢店加一倍,遇花喝一斗。
這一路上,他一共遇到店5次,遇到花10次,已知最後一次遇到的是花,他正好把酒喝光了。
請你計算李白遇到店和花的次序,可以把遇店記為a,遇花記為b。則:babaabbabbabbbb 就是合理的次序。
像這樣的答案一共有多少呢?請你計算出所有可能方案的個數(包含題目給出的)。
public
class
libaidajiu
// 最後乙個遇見花並且把酒喝光
if(b ==
0&& f ==
1&& a ==1)
// 逢店加一倍 遇花喝1鬥
return
func
(b -
1, f,
2* a)
+func
(b, f -
1, a -1)
;}public
static
void
main
(string[
] args)
}
小明看完電影《第39級台階》,離開電影院的時候,他數了數視覺的台階數,恰好是39級。站在台階前,
他突然又想起乙個問題: 如果我每一步只能邁上1個或2個台階,先邁左腳,然後左右交替,
最後一步邁右腳,也就是說一共要邁偶數步。那麼上完39級台階,有多少種不同的上法呢?
public
class
taijie
//台階數為39,步數為偶數時上台階的方法加一種
if(t ==
39&& foot %2==
0)//一次上乙個台階
method
(t+1
,foot+1)
;//一次上兩個台階
method
(t+2
,foot+1)
;}public
static
void
main
(string[
] args)
}
遞迴可以讓複雜的問題變的簡單,我們只需要給遞迴乙個出口,它就可以幫我們把所有的可能性都計算出來,遞迴極大程度的減少了**量,所以在理解的時候變得有點困難,但我們自己可以不用知道遞迴的內部具體是如何實現的,只需要知道該如何去用,遞迴是我們解決演算法問題的好幫手! 一些有趣的演算法題
老崔去某廠筆試時,遇到了經典的 狼 羊 白菜 過河問題 由於經常看演算法方面的內容,這道對於他來說,so easy。題目大概是這樣 題號1 農夫需要把狼 羊 菜和自己運到河對岸去,只有農夫能夠划船,而且船比較小,除農夫之外每次只能運一種東西,還有乙個棘手問題,就是如果沒有農夫看著,羊會偷吃菜,狼會吃...
algorithm 一些有趣的思維題
hdu 1108 include iostream using namespace std intmain return0 乙個數的任何次方一共只有四種情況,分別列出這四種情況後取餘冪就可以知道尾數是多少。codeforces 1217a include iostream include algor...
一些遇到的有趣的程式題
程式是計算陣列直方圖最大矩形面積,直方圖每列寬度為1,如的最大矩形面積是7 2 14 思路 從左往右,從a 0 到a n 1 依次計算能和a i 組成矩形的最大面積,因為只有大於或者等於a i 才能和a i 組成矩形塊 所以分別從a i 開始,從左擴充套件計算能和a i 組成的矩形的塊數,再往右計算...