遞歸算法int fib(int n){ //求fibonacci數(shù)列第n個(gè)數(shù) if(n==1 || n==2) return 1; else return fib(n-1) + fib(n-2);}非遞歸int fib(int n){ int a = 1, b = 1; if(n==1 || n==2) return 1; for(int i=3; i
遞歸就是方法里調(diào)用自身。
在使用遞歸時(shí),必須有一個(gè)明確的遞歸結(jié)束條件,稱為遞歸出口。
遞歸算法解題通常顯得很簡潔,但遞歸算法解題的運(yùn)行效率較低,所以一般不提倡用遞歸算法設(shè)計(jì)程序。(用遞歸能實(shí)現(xiàn)的用循環(huán)也能實(shí)現(xiàn))
在遞歸調(diào)用的過程當(dāng)中系統(tǒng)為每一層的返回點(diǎn)、局部量等開辟了棧來存儲(chǔ),遞歸次數(shù)過多容易造成棧溢出等,所以一般不提倡用遞歸算法設(shè)計(jì)程序
程序調(diào)用自身的編程技巧稱為遞歸( recursion)。遞歸做為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用。 一個(gè)過程或函數(shù)在其定義或說明中有直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。
遞歸的能力在于用有限的語句來定義對(duì)象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進(jìn)段和遞歸返回段。當(dāng)邊界條件不滿足時(shí),遞歸前進(jìn);當(dāng)邊界條件滿足時(shí),遞歸返回。
遞歸是指程序調(diào)用自身的編程技巧。
遞歸作為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用。
一個(gè)過程或函數(shù)在其定義或說明中有直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來求解;
遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。
遞歸的能力在于用有限的語句來定義對(duì)象的無限集合。
一般來說,遞歸需要有邊界條件、遞歸前進(jìn)段和遞歸返回段。
當(dāng)邊界條件不滿足時(shí),遞歸前進(jìn);當(dāng)邊界條件滿足時(shí),遞歸返回。
(1) 遞歸就是在過程或函數(shù)里調(diào)用自身;
(2) 在使用遞歸策略時(shí),必須有一個(gè)明確的遞歸結(jié)束條件,稱為遞歸出口。
遞歸的另一種定義:
遞歸,就是在運(yùn)行的過程中調(diào)用自己。
在數(shù)理邏輯和計(jì)算機(jī)科學(xué)中,遞歸函數(shù)或μ-遞歸函數(shù)是一類從自然數(shù)到自然數(shù)的函數(shù)。直覺上遞歸函數(shù)是"可計(jì)算的"。
遞歸,就是在運(yùn)行的過程中調(diào)用自己。 構(gòu)成遞歸需具備的條件:
1. 子問題須與原始問題為同樣的事,且更為簡單;
2. 不能無限制地調(diào)用本身,須有個(gè)出口,化簡為非遞歸狀況處理。 以遞歸方式實(shí)現(xiàn)階乘函數(shù)的實(shí)現(xiàn): [cpp] view plain copy int fact(int n) { if (n < 0) return 0; else if(n == 0 || n == 1) return 1; else return n * fact(n - 1); }
理論上而言,所有遞歸程序都可以用非遞歸程序來實(shí)現(xiàn)。
循環(huán)方法是所有遞歸到非遞歸的轉(zhuǎn)換中最理想的方法,可以將開銷減少到最小。不過也是分析起來最復(fù)雜的,對(duì)于簡單的遞歸可以用這樣的方法來處理。為了理解方便,下面是用一個(gè)最簡單的例子:求N的階乘。遞歸的方法:
int Factorial(int n){ if( n > 1){ return n*Factorial(n-1);//遞歸函數(shù)調(diào)用 } else if(n == 1){ return 1; //遞歸出口 } else{ return ERROR;//報(bào)告輸入錯(cuò)誤 }} 轉(zhuǎn)為非遞歸的方法:
Factorial(int n){ int k = 1 ;//增量 int t = 1 ;//臨時(shí)結(jié)果 while(k!=n){ t*=k; k++; } return t;}
尾遞歸:程序中只有一句遞歸語句,且在末尾。單向遞歸:指程序中的遞歸語句,在本程序操作執(zhí)行前,都已經(jīng)完成,如斐波那契數(shù)列。這樣一來,共同的特點(diǎn)是在化非遞歸時(shí)都沒有非要保存的分支路線
遞歸做為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用.是指函數(shù)/過程/子程序在運(yùn)行過程序中直接或間接調(diào)用自身而產(chǎn)生的重 一個(gè)過程或函數(shù)在其定義或說明中又直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。遞歸的能力在于用有限的語句來定義對(duì)象的無限集合。用遞歸思想寫出的程序往往十分簡潔易懂。
一般來說,遞歸需要有邊界條件、遞歸前進(jìn)段和遞歸返回段。當(dāng)邊界條件不滿足時(shí),遞歸前進(jìn);當(dāng)邊界條件滿足時(shí),遞歸返回。
注意:
(1) 遞歸就是在過程或函數(shù)里調(diào)用自身;
(2) 在使用遞增歸策略時(shí),必須有一個(gè)明確的遞歸結(jié)束條件,稱為遞歸出口。
遞歸算法一般用于解決三類問題:
(1)數(shù)據(jù)的定義是按遞歸定義的。(Fibonacci函數(shù))
(2)問題解法按遞歸算法實(shí)現(xiàn)。(回溯)
(3)數(shù)據(jù)的結(jié)構(gòu)形式是按遞歸定義的。
遞歸的缺點(diǎn):
遞歸算法解題的運(yùn)行效率較低。在遞歸調(diào)用的過程當(dāng)中系統(tǒng)為每一層的返回點(diǎn)、局部量等開辟了棧來存儲(chǔ)。遞歸次數(shù)過多容易造成棧溢出等。遞歸做為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用.是指函數(shù)/過程/子程序在運(yùn)行過程序中直接或間接調(diào)用自身而產(chǎn)生的重入現(xiàn)像. 一個(gè)過程或函數(shù)在其定義或說明中又直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。遞歸的能力在于用有限的語句來定義對(duì)象的無限集合。用遞歸思想寫出的程序往往十分簡潔易懂。
一般來說,遞歸需要有邊界條件、遞歸前進(jìn)段和遞歸返回段。當(dāng)邊界條件不滿足時(shí),遞歸前進(jìn);當(dāng)邊界條件滿足時(shí),遞歸返回。
注意:
(1) 遞歸就是在過程或函數(shù)里調(diào)用自身;
(2) 在使用遞增歸策略時(shí),必須有一個(gè)明確的遞歸結(jié)束條件,稱為遞歸出口。
遞歸算法一般用于解決三類問題:
(1)數(shù)據(jù)的定義是按遞歸定義的。(Fibonacc
遞歸指的是程序調(diào)用自身的編程技巧。
遞歸作為一種算法在程序設(shè)計(jì)語言中廣泛應(yīng)用。一個(gè)過程或函數(shù)在其定義或說明中有直接或間接調(diào)用自身的一種方法,它通常把一個(gè)大型復(fù)雜的問題層層轉(zhuǎn)化為一個(gè)與原問題相似的規(guī)模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復(fù)計(jì)算,大大地減少了程序的代碼量。遞歸的能力在于用有限的語句來定義對(duì)象的無限集合。一般來說,遞歸需要有邊界條件、遞歸前進(jìn)段和遞歸返回段。當(dāng)邊界條件不滿足時(shí),遞歸前進(jìn);當(dāng)邊界條件滿足時(shí),遞歸返回。