1樓:網友
和迭代差不多,只是通過定義和呼叫函式來實現迭代把事情分解成相同的步驟重複執行直到符合某一條件時結束,再反過來遞推到最初的狀態,問題就解決了。
比如定義(用的是c語言)
int fun(int a) }
在fun裡面再定義fun,這個fun都只做一件事,把a的內容和fun(a-1)相乘作為返回值。
這裡要有個終止條件,即a=1時返回值為1,這樣,如果我給最初的fun裡的a賦值為5,第一步為5*fun(4),而執行fun(4)的結果為4*fun(3)..直到fun(2)=2*fun(1)即fun(2)=2*1,再把fun(2)代回去,得fun(3)=3*2*1,最後倒推的結果為fun(5)=5*4*3*2*1,即這個遞迴函式實現了a的階乘fun(a)=a!
夠詳細了吧,覺得好的話給我加分吧 ^_
什麼是遞迴演算法?有什麼作用?
2樓:匿名使用者
我感覺遞迴較接近思維的方式,用於解一些光用迴圈解起來較複雜的問題例1.階乘(算比較有特點的了)
計算x!一般迴圈就是。
int multi = 1;
if (x <=1) return (1);
for(int i=1;i<=x;i++)multi = multi*i;
return(multi);
遞迴把x!看作x*(x-1)!
int multi(int x)
這樣就能把x!算出來。
例2 最著名的就是漢諾塔了。
你可以網上找點資料看看。
什麼是遞迴演算法
3樓:雪琳戀庚
遞迴演算法是把問題轉化為規模縮小了的同類問題的子問題。然後遞迴呼叫函式(或過程)來表示問題的解。
一個過程(或函式)直接或間接呼叫自己本身,這種過程(或函式)叫遞迴過程(或函式)。
遞迴過程一般通過函式或子過程來實現。遞迴方法:在函式或子過程的內部,直接或者間接地呼叫自己的演算法。
特點遞迴演算法是一種直接或者間接地呼叫自身演算法的過程。在計算機編寫程式中,遞迴演算法對解決一大類問題是十分有效的,它往往使演算法的描述簡潔而且易於理解。
遞迴演算法解決問題的特點:
(1) 遞迴就是在過程或函式里呼叫自身。
(2) 在使用遞迴策略時,必須有一個明確的遞迴結束條件,稱為遞迴出口。
(3) 遞迴演算法解題通常顯得很簡潔,但遞迴演算法解題的執行效率較低。所以一般不提倡用遞迴演算法設計程式。
(4) 在遞迴呼叫的過程當中系統為每一層的返回點、區域性量等開闢了棧來儲存。遞迴次數過多容易造成棧溢位等。所以一般不提倡用遞迴演算法設計程式。
要求遞迴演算法所體現的「重複」一般有三個要求:
一是每次呼叫在規模上都有所縮小(通常是減半);
二是相鄰兩次重複之間有緊密的聯絡,前一次要為後一次做準備(通常前一次的輸出就作為後一次的輸入);
三是在問題的規模極小時必須用直接給出解答而不再進行遞迴呼叫,因而每次遞迴呼叫都是有條件的(以規模未達到直接解答的大小為條件),無條件遞迴呼叫將會成為死迴圈而不能正常結束。
參考:
4樓:匿名使用者
移n個盤是已移n-1個盤為條件的,兩者的共同點是移盤。所以可以用f(n)表示移n個盤,f(n-1)表示移n-1個盤,那麼移n個盤和移n-1個盤有什麼關係呢?
這就需要預先分析問題才能得出具體的關係。
在這個問題中,把n個盤從a移到c需要三個步驟來完成。
個盤從a移到b
2 1個盤從a移到c
3 n-1個盤從b移到c
已知n-1個盤從a移到b是可行的,為什麼?
因為移1個盤是可行,那麼移2個盤也是可行,移 3個盤是已移2個盤為條件的,所以移3個盤也是可行的,所以移n個 盤是可行的。
所以根據已知條件可以解得:
設f(n, a, b,c) 表示 把n個盤從a移到c 藉助b --這裡很關鍵,這是搞懂遞迴的關鍵關鍵。
那麼把n-1個盤從a移到b 藉助c 怎樣表示呢?
很明顯是:f(n-1, a, c,b)
那麼把1個盤從a移到c怎樣表示呢?
很明顯是:f(1, a, b,c)
那麼把n-1個盤從b移到c 藉助a 怎樣表示呢?
很明顯是:f(n-1, b, a,c)
所以f(n, a, b,c) =f(n-1, a,c,b) ,f(1, a, b,c), f(n-1, b,a,c))
這和等差等比數列一個原理。
沒有什麼 特別的。
記住是問題有這樣遞推關係才可以使用這種方法。
如果要你計算1+2+8+22 的結果 你就不能使用遞迴。
因為該問題的後一步驟與前一步驟不具有規律性,所以已知前一個步驟並不能求的後一個步驟的值。
這個問題就可以使用遞迴。
原因你懂了吧。
至於爬樓梯問題,無限級分類 問題等一些遞迴問題,那不過時小菜一碟。
一句話:後一步驟依賴前一步驟並且二者聯絡具有規律性,運用遞迴必然成功。
5樓:安徽新華電腦專修學院
遞迴演算法(英語:recursion algorithm)在電腦科學中是指一種通過重複將問題分解為同類的子問題而解決問題的方法。
遞迴式方法可以被用於解決很多的電腦科學問題,因此它是電腦科學中十分重要的一個概念。絕大多數程式語言支援函式的自呼叫,在這些語言中函式可以通過呼叫自身來進行遞迴。
計算理論可以證明遞迴的作用可以完全取代迴圈,因此在很多函式程式語言(如scheme)中習慣用遞迴來實現迴圈。
遞迴演算法是什麼?
遞迴演算法的速度特別慢的原因是什麼?
6樓:
遞迴呼叫本身需要使用系統棧,每次分配函式記憶體以及棧都需要時間。不過這個過程耗時並不多,可以說,單純的遞迴本身並不比非遞迴慢多少。
然而,實踐中就會發現,遞迴處理部分問題,特別是遞推類問題時會表現出效率極低。這個問題的出現是因為重複計算。
舉例說,用遞迴求解斐波那契數列的第n項,一般的遞迴公式為。
f(n) =f(n-1)+f(n-2)
f(2) =1
f(1) =1
請嘗試模擬計算機執行這個遞迴,你會發現,其中的某一項f(x)並不是只算了一次。當你計算f(5)的時候,你會試圖計算f(4)和f(3),然而在你計算f(4)的時候其實也要計算f(3),這樣f(3)就被呼叫了兩次。
想象這個過程是指數型擴充套件的,效率會隨著n的增大極快地下降。
要解決這個問題,可以使用記憶化思想。
定義記憶陣列r,函式體改為:
define f(n):
if r[n] is defined, then simply return r[n] as the answer.
else, f(n) =f(n-1) +f(n-2)
before return the value, take it down in r[n].
如此改進之後的遞迴函式效率上與遞推演算法相差無幾。
j**a中遞迴演算法是什麼怎麼算的?
7樓:匿名使用者
簡單點說是在方法中呼叫自己,直到某一條件退出。
8樓:匿名使用者
遞迴做為一種演算法在程式設計語言中廣泛應用。是指函式/過程/子程式在執行過程遞迴的作用:遞迴演算法可以解決一些通過遞迴定義的題目。首先需要明白什麼是遞迴。
遞迴演算法?怎麼實現
9樓:匿名使用者
舉個例子:
讓你求出1到n的全排列。例如3:123 132 213 231 312 321
對於n=3的情況,你可以寫3個for 迴圈來列舉每一位,判斷各個為上的數字數否相等,若都不相等,那麼輸出。
但是對於n的其他情況,由於你不知道n等於幾,所以你沒法寫n個for迴圈。
用遞迴演算法可以解決這個問題。
一共遞迴n層,到達第n層時就不再遞迴了,如果沒有到達第n層,那麼就在該層寫一個for迴圈,然後遞迴進入下一層。
pascal**:(僅用於寫n個for迴圈)
procedure dfs(k:longint);
var i:longint;
beginif k>n then exit;
for i:=1 to n do
dfs(k+1);
end;
遞迴演算法的速度會特別慢的原因是什麼?
10樓:翎
主要有兩個原因吧。
1、遞迴需要不斷的向下開棧,相較於迴圈,開銷自然上來了,開棧的開銷主要表現在:需要向棧上壓引數(即訪存,一般的**會儘可能使用暫存器進行運算),需要往棧上壓函式返回地址,需要給區域性變數準備空間。
2、棧保護機制,因為現代編譯器為了防止各種溢位攻擊,會給函式呼叫加上棧保護,對應到指令層次就是會往棧上壓一個金絲雀值。
所以一般追求效率的地方都會把遞迴改成迴圈,或者手動模擬棧。
什麼是迭代跟遞迴演算法?二者有什麼區別
《演算法設計與分析》中遞迴的概念是什麼謝謝大家
自己呼叫自己,調到底部再,層層返回,不推薦使用,比較耗時間。簡單的講就是自己呼叫自己,你別把他當什麼遞迴,在分析的時候就把它當成呼叫別的函式,這樣好理解些。這個設計起來很難,而且執行速度低,一般能不用就不用。希望對你有用!遞迴的基本概念和特點 程式呼叫自身的程式設計技巧稱為遞迴 recursion ...
C語言二叉樹遞迴演算法怎麼做?什麼是二叉樹的遞迴?
include include struct treenode typedef treenode bitree void visit treenode node 結點總數。int node bitree t return node t left node t right 1 前序。void preo...
非遞迴的二叉樹前序遍歷演算法有什麼用途
遞迴和非遞迴只是解決問題的方法的不同,本質還是一樣的。2.遞迴演算法相對於非遞迴演算法來說效率通常都會更低2.2 由於編譯器對附加的一些棧保護機制會導致遞迴執行的更加低效3.使用迴圈代替遞迴演算法,通常可以獲得更好的執行效率和空間效率,在二叉樹層次較深的情況下,採用非遞迴方式遍歷能夠有效的提升遍歷的...