遞迴和一些有趣的演算法題

2021-09-25 08:29:19 字數 2083 閱讀 4652

遞迴指的是在方法內部對方法自身呼叫;遞迴一般用於一些常見的演算法的解決,在實際應用中,

比如對資料夾內部檔案的遞迴檢索;以及樹形選單的顯示;遞迴是對迴圈的一種補充 。

遞迴,就是在執行的過程中呼叫自己。

構成遞迴需具備的條件:

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 組成的矩形的塊數,再往右計算...