1樓:蹦迪小王子啊
1、可以把要解決的問題轉化為一個新問題,而這個新的題的解決方法仍與原來的解決方法相同,只是所處理的物件有規律地遞增或遞減。
2、可以應用這個轉化過程使問題得到解決。
3、必定要有一個明確的結束遞迴的條件。
例如:public class x
//1~n 的累加遞迴
public int x(int n){
return n>1?n+x(--n):n;
擴充套件資料設(a0,a1,...,ar,...)是一個序列,把該序列中的ar和它前面的幾個ai(0≤i有時也稱遞迴關係式為差分方程。
為了能從遞迴關係式計算出序列的每一項,必須知道序列開始的一個或幾個數,稱這樣的數為初始條件或初始值。
在許多情況下,得到遞迴關係式本身就是朝解決一個計數問題邁了一大步。即使不能從這個遞迴關係式很快地解出它的一般表示式,這也是相當不錯的了。這是因為採取逐步計算的方法可以得到序列各項的值。
有些例子說明,沒有遞迴關係,計算的可能性根本就不存在。
2樓:
我總結的遞迴三個條件是:
1.具有返回值,且返回型別跟引數型別相容.
2.具有結束條件.
3.自身呼叫.
我覺得遞迴就是,不斷地自身呼叫自身,但是不能沒完沒了,那樣就成了死迴圈了,就是必須有結束條件,讓它跳出迴圈。(一般來說跳出迴圈的體就是直接return一個返回值)
你需要一個可以找到規律的迴圈條件,並且在迴圈體裡要做的同一件事情,這時候可以用遞迴來實現,這是我的想法,供樓主參考。
誰能夠解釋一下遞迴的本質!以及如何使用遞迴!
3樓:匿名使用者
[遞迴]-分- [遞推] 和 [迴歸]
遞迴的概念及遞迴演算法的結構
1、所謂的遞迴,是指函式在執行過程中自己呼叫了自己或者說某種資料結構在定義時又引用了自身。這兩種情況都可理解為遞迴。比如:
void fun()
//fun
以上函式fun就是一個遞迴函式。而針對於各種資料結構中的遞迴結構就更多了,如單連結串列,廣義表,樹。在這些遞迴結構中,具有一個相同的特徵:其中的某個域的資料型別是其結點型別本身!
2、遞迴演算法的大致結構為:
a、遞迴出口
b、遞迴體
一個遞迴演算法,當其問題求解的規模越來越小時必定有一個遞迴出口,就是不再遞迴呼叫的語句。遞迴體則是每次遞迴時執行的語句序列。比如以下簡要描述的遞迴函式中:
f(n)=1 (當n=0時)
f(n)=n*f(n-1) (當n>0時)
這個遞迴函式,實際是求n的階乘。當n=0時,不再遞迴呼叫,而當其值置為1;當n>0時,就執行n*f(n-1),這是遞迴呼叫。從整體上理解遞迴演算法的大致結構有利於我們在設計遞迴演算法時,從總體上把握演算法的正確性。
二、棧與遞迴的關係:遞迴的執行
遞迴在實現過程中是藉助於棧來實現的。高階語言的函式呼叫,每次呼叫,系統都要自動為該次呼叫分配一系列的棧空間用於存放此次呼叫的相關資訊:返回地址,區域性變數等。
這些資訊被稱為工作記錄(或活動記錄)。而當函式呼叫完成時,就從棧空間內釋放這些單元,但是,在該函式沒有完成前,分配的這些單元將一直儲存著不被釋放。遞迴函式的實現,也是通過棧來完成的。
在遞迴函式沒有到達遞迴出口前,都要不停地執行遞迴體,每執行一次,就要在工作棧中分配一個工作記錄的空間給該「層」呼叫存放相關資料,只有當到達遞迴出口時,即不再執行函式呼叫時,才從當前層返回,並釋放棧中所佔用的該「層」工作記錄空間。請大家注意,遞迴呼叫時,每次儲存在棧中的是區域性資料,即只在當前層有效的資料,到達下一層時上一層的資料對本層資料沒有任何影響,一切從當前呼叫時傳過來的實在引數重新開始。
由此可見,從嚴老師p版教材中,利用棧將遞迴向非遞迴轉化時所採用的方法,實質是用人工寫的語句完成了本該系統程式完成的功能,即:棧空間中工作記錄的儲存和釋放。大家在以後的作題時,可以參照以上的分析來理解遞迴函式的執行過程。
實際上,現在的考試中,已經很少見到有學校要求運用棧與實現遞迴轉化為非遞迴來解題了,所以,大家能理解這個演算法更好,不能理解的也不用太擔心。我曾就此問題專門向嚴老師諮詢過,嚴老師說之所以在c版的教材中沒有講到這個演算法,也是考慮到了目前國內學校在這方面已經基本不作要求。但是,遞迴演算法的執行過程應該心中有數。
三、遞迴與遞推的關係
「遞迴演算法的執行過程分遞推與迴歸兩個階段。在遞推階段,把較複雜的問題(規模為n)的求解推到比原問題簡單一些的問題(規模小於n)的求解。在迴歸階段,當獲得最簡單的情況後,逐級返回,依次獲得稍複雜問題的解。
」(摘自於「高程」教材)
「遞推法是利用問題本身所具有的一種遞推關係求問題解的一種方法。設要求問題規模為n的解,當n=1時,解或已知,或能非常方便地得到解。能採用遞推法構造演算法的問題有重要的遞推性質,即當得到問題規模為i-1的解後,由問題的遞推性質,能從已求得的規模為1,2,3、、、i-1的一系列解,構造出問題規模為i的解。
直到最終得到問題規模為n的解。」
由此可見,遞推是遞迴的一個階段,遞迴包含著遞推。當然,對於實際的演算法設計,知不知道這兩者之間的關係並不重要,重要的是我們能找出這其中的遞推規律和迴歸時機。
四、適合於用遞迴實現的問題型別
必須具有兩個條件的問題型別才能用遞迴方法求得:
1、規模較大的一個問題可以向下分解為若干個性質相同的規模較小的問題,而這些規模較小的問題仍然可以向下分解。
2、當規模分解到一定程度時,必須有一個終止條件,不得無限分解。
由此可見適合於遞迴實現的問題型別有:
1、函式定義是遞迴的。如階乘,fib數列。
2、資料結構遞迴的相關演算法。如:樹結構。
3、解法是遞迴的。如:漢諾塔問題。
五、遞迴演算法的設計
從遞迴演算法的結構來分析,進行遞迴演算法的設計時,無非要解決兩個問題:遞迴出口和遞迴體。即要確定何時到達遞迴出口,何時執行遞迴體,執行什麼樣的遞迴體。
遞迴演算法演算法設計的關鍵是儲存每一層的區域性變數並運用這些區域性變數。由此,遞迴演算法的設計步驟可從以下三步來作:
1、分析問題,分解出小問題;
2、找出小問題與大問題之間的關係,確定遞迴出口;
3、用演算法語言寫出來。
六、遞迴演算法向非遞迴演算法的轉化方法
1、迭代法
如果一個函式既有遞迴形式的定義,又有非遞迴的迭代形式的定義,則通常可以用迴圈來實現遞迴演算法的功能。
2、消除尾遞迴
尾遞迴,是一類特殊的遞迴演算法。它是指在此遞迴演算法中,當執行了遞迴呼叫後,遞迴呼叫語句後面再沒有其它可以執行的語句了,它即沒有用到外層的狀態,也沒有必要保留每次的返回地址,因為其後不再執行其它任何*作,所以可以考慮消除遞迴演算法。這種情況下,我們可以用迴圈結構設定一些工作單元來幫助消除尾遞迴,這些工作單元用於存放一層層的引數。
3、利用棧
當一個遞迴演算法不利於用迭代法和消除尾遞迴法實現向非遞迴演算法的轉化時,可以考慮用棧來實現。實現的過程實際上就是用人工的方法模擬系統程式來儲存每層的引數,返回地址,以及對引數進行運算等。
一般情況下,對於遞迴演算法向非遞迴演算法的轉化問題,特別是結構定義時的遞迴演算法,我們通常先寫出遞迴演算法,然後再向非遞迴演算法轉化,而不是首先就嘗試寫出非遞迴演算法來。
4樓:匿名使用者
函式的遞迴呼叫
一個函式在它的函式體內呼叫它自身稱為遞迴呼叫。這種函式稱為遞迴函式。c語言允許函式的遞迴呼叫。
在遞迴呼叫中,主調函式又是被調函式。執行遞迴函式將反覆呼叫其自身,每呼叫一次就進入新的一層。
例如有函式f如下:
int f(int x)
這個函式是一個遞迴函式。但是執行該函式將無休止地呼叫其自身,這當然是不正確的。為了防止遞迴呼叫無終止地進行,必須在函式內有終止遞迴呼叫的手段。
常用的辦法是加條件判斷,滿足某種條件後就不再作遞迴呼叫,然後逐層返回。下面舉例說明遞迴呼叫的執行過程。
【例】用遞迴法計算n!
用遞迴法計算n!可用下述公式表示:
n!=1 (n=0,1)
n×(n-1)! (n>1)
按公式可程式設計如下:
long ff(int n)
main()
程式中給出的函式ff是一個遞迴函式。主函式呼叫ff 後即進入函式ff執行,如果n<0,n==0或n=1時都將結束函式的執行,否則就遞迴呼叫ff函式自身。由於每次遞迴呼叫的實參為n-1,即把n-1的值賦予形參n,最後當n-1的值為1時再作遞迴呼叫,形參n的值也為1,將使遞迴終止。
然後可逐層退回。
下面我們再舉例說明該過程。設執行本程式時輸入為5,即求5!。在主函式中的呼叫語句即為y=ff(5),進入ff函式後,由於n=5,不等於0或1,故應執行f=ff(n-1)*n,即f=ff(5-1)*5。
該語句對ff作遞迴呼叫即ff(4)。
進行四次遞迴呼叫後,ff函式形參取得的值變為1,故不再繼續遞迴呼叫而開始逐層返回主調函式。ff(1)的函式返回值為1,ff(2)的返回值為1*2=2,ff(3)的返回值為2*3=6,ff(4)的返回值為6*4=24,最後返回值ff(5)為24*5=120。
什麼是遞迴演算法
5樓:
遞迴演算法就是一個函式通過不斷對自己的呼叫而求得最終結果的一種思維巧妙但是開銷很大的演算法。
比如:漢諾塔的遞迴演算法:
void move(char x,char y)
void hanoi(int n,char one,char two,char three)
}main()
我說下遞迴的理解方法
首先:對於遞迴這一類函式,你不要糾結於他是幹什麼的,只要知道他的一個模糊功能是什麼就行,等於把他想象成一個能實現某項功能的黑盒子,而不去管它的內部操作先,好,我們來看下漢諾塔是怎麼樣解決的
首先按我上面說的把遞迴函式想象成某個功能的黑盒子,void hanoi(int n,char one,char two,char three); 這個遞迴函式的功能是:能將n個由小到大放置的小長方形從one 位置,經過two位置 移動到three位置。那麼你的主程式要解決的問題是要將m個的"漢諾塊"由a藉助b移動到c,根據我們上面說的漢諾塔的功能,我相信傻子也知道在主函式中寫道:
hanoi(m,a,b,c)就能實現將m個塊由a藉助b碼放到c,對吧?所以,mian函式裡面有hanoi(m,'a','c','b');這個呼叫。
接下來我們看看要實現hannoi的這個功能,hannoi函式應該幹些什麼?
在hannoi函式裡有這麼三行
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
同樣以黑盒子的思想看待他,要想把n個塊由a經過b搬到c去,是不是可以分為上面三步呢?
這三部是:第一步將除了最後最長的那一塊以外的n-1塊由one位置經由three搬到two 也就是從a由c搬到b 然後把最下面最長那一塊用move函式把他從a直接搬到c 完事後 第三步再次將剛剛的n-1塊藉助hannoi函式的功能從b由a搬回到c 這樣的三步實習了n塊由a經過b到c這樣一個功能,同樣你不用糾結於hanoi函式到底如何實現這個功能的,只要知道他有這麼一個神奇的功能就行
最後:遞迴都有收尾的時候對吧,收尾就是當只有一塊的時候漢諾塔怎麼個玩法呢?很簡單吧,直接把那一塊有amove到c我們就完成了,所以hanoni這個函式最後還要加上 if(n==1)move(one,three);(當只有一塊時,直接有amove到c位置就行)這麼一個條件就能實現hanoin函式n>=1時將n個塊由a經由b搬到c的完整功能了。
遞迴這個複雜的思想就是這樣簡單解決的,呵呵 不知道你看懂沒?純手打,希望能幫你理解遞迴
總結起來就是不要管遞迴的具體實現細節步驟,只要知道他的功能是什麼,然後利用他自己的功能通過呼叫他自己去解決自己的功能(好繞口啊,日)最後加上一個極限情況的條件即可,比如上面說的1個的情況。
請問省考的報考條件是什麼,公務員考試的條件是什麼?
你好,省考報名條件每個省的考試要求都不太一樣的.具體的報考條件需要參加所報考崗位要求進行。2020年江西省考暫未出公告 一 報考條件 1.具有中華人民共和國國籍 2.18週歲以上 35週歲以下 即在1983年3月8日至2001年3月8日期間出生 按照有關政策規定對年齡 條件有特殊要求的,以招考職位要...
新東方烹飪學校的招生條件是什麼?請具體,謝謝
新東方烹飪學校招生沒有太多限制條件。凡是熱愛廚師行業,對烹飪有興趣,對餐飲行業有創業興趣的有志人士,均可報名。新東方目前有中餐 西餐 西點三大院系,學校招生物件男女不限,有無烹飪基礎均可報名。新東方烹飪教育建立於1988年,隸屬於新華教育集團,新東方烹飪教育一直致力於傳承中華美食文化,融匯了川菜 湘...
申請低保的條件是什麼,低保申請的條件是什麼
辦理低保戶標準的條件是 1 沒有經濟 和勞動能力,不能安置贍養人或扶養人的居民 2 領取失業救濟金期間,家庭人均月收入低於本市最低生活保障標準的居民 3 領工資或最低工資 退休人員養老金後,家庭人均收入仍低於本市最低生活水平的居民。其他家庭人均月收入低於本市最低生活保障標準的居民。法律依據 中華人民...