㈠ 什麼是遞推法和遞歸法兩者在思想上有何聯系
1、遞推法:遞推演算法是一種根據遞推關系進行問題求解的方法。通過已知條件,利用特定的遞推關系可以得出中間推論,直至得到問題的最終結果。遞推演算法分為順推法和逆推法兩種。
2、遞歸法:在計算機編程中,一個函數在定義或說明中直接或間接調用自身的編程技巧稱為遞歸。通常把一個大型復雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞歸策略只需少量的程序就可描述出解題過程所需要的多次重復計算,大大地減少了程序的代碼量。遞歸做為一種演算法在程序設計語言中廣泛應用。
3、兩者的聯系:在問題求解思想上,遞推是從已知條件出發,一步步的遞推出未知項,直到問題的解。從思想上講,遞歸也是遞推的一種,只不過它是對待解問題的遞推,直到把一個復雜的問題遞推為簡單的易解問題。然後再一步步的返回去,從而得到原問題的解。
(1)遞推演算法擴展閱讀
相對於遞歸演算法,遞推演算法免除了數據進出棧的過程,也就是說,不需要函數不斷的向邊界值靠攏,而直接從邊界出發,直到求出函數值。
比如階乘函數:f(n)=n*f(n-1)
在f(3)的運算過程中,遞歸的數據流動過程如下: f(3){f(i)=f(i-1)*i}-->f(2)-->f(1)-->f(0){f(0)=1}-->f(1)-->f(2)--f(3){f(3)=6}
而遞推如下: f(0)-->f(1)-->f(2)-->f(3) 由此可見,遞推的效率要高一些,在可能的情況下應盡量使用遞推。
但是遞歸作為比較基礎的演算法,它的作用不能忽視。所以,在把握這兩種演算法的時候應該特別注意。
㈡ 遞推演算法的遞推與遞歸的比較
相對於遞歸演算法,遞推演算法免除了數據進出棧的過程,也就是說,不需要函數不斷的向邊界值靠攏,而直接從邊界出發,直到求出函數值.
比如階乘函數:f(n)=n*f(n-1)
在f(3)的運算過程中,遞歸的數據流動過程如下:
f(3){f(i)=f(i-1)*i}-->f(2)-->f(1)-->f(0){f(0)=1}-->f(1)-->f(2)--f(3){f(3)=6}
而遞推如下:
f(0)-->f(1)-->f(2)-->f(3)
由此可見,遞推的效率要高一些,在可能的情況下應盡量使用遞推.但是遞歸作為比較基礎的演算法,它的作用不能忽視.所以,在把握這兩種演算法的時候應該特別注意。 所謂順推法是從已知條件出發,逐步推算出要解決的問題的方法叫順推。
如斐波拉契數列,設它的函數為f(n),已知f(1)=1,f(2)=1;f(n)=f(n-2)+f(n-1)(n>=3,n∈N)。則我們通過順推可以知道,f(3)=f(1)+f(2)=2,f(4)=f(2)+f(3)=3……直至我們要求的解。 所謂逆推法從已知問題的結果出發,用迭代表達式逐步推算出問題的開始的條件,即順推法的逆過程,稱為逆推。
㈢ 遞推演算法和遞歸演算法有什麼區別
1、演算法的過程不同
遞推演算法是一種簡單的演算法,即通過已知條件,利用特定關系得出中間推論,直至得到結果的演算法。
遞歸演算法在計算機科學中是指一種通過重復將問題分解為同類的子問題而解決問題的方法。遞歸式方法可以被用於解決很多的計算機科學問題,因此它是計算機科學中十分重要的一個概念。
㈣ 遞推和遞歸演算法有什麼區別
舉個例子,數列:1,1,2,3,5,8,13,21,……
要求第100項,就得從前兩項開始推,直到第100項,是一個遞推的過程
f[0]=f[1]=1;
for(i=2;i<101;i++)
{
f[i]=f[i-1]+f[i-2];
}
如果已知:f(n)=f(n-1)+f(n-2),f(0)=f(1)=1;
求f(n)就可以寫一個函數:
int f(int n)
{
if(n==0||n==1)
return 1;
else
return f[n-1]+f[n-2];
}
這個就是回溯,因為比較簡單,所以其實也可以用遞推來實現
㈤ 遞推演算法是怎麼回事
遞推定義
遞推演算法是一種簡單的演算法,即通過已知條件,利用特定關系得出中間推論,直至得到結果的演算法。
遞推演算法分為順推和逆推兩種。
順推法
所謂順推法是從已知條件出發,逐步推算出要解決的問題的方法叫順推。
如斐波拉契數列,設它的函數為f(n),已知f(1)=1,f(2)=1;f(n)=f(n-2)+f(n-1)(n>=3,n∈N)。則我們通過順推可以知道,f(3)=f(1)+f(2)=2,f(4)=f(2)+f(3)=3……直至我們要求的解。
逆推法
所謂逆推法從已知問題的結果出發,用迭代表達式逐步推算出問題的開始的條件,即順推法的逆過程,稱為逆推。
遞推與遞歸的比較
相對於遞歸演算法,遞推演算法免除了數據進出棧的過程,也就是說,不需要函數不斷的向邊界值靠攏,而直接從邊界出發,直到求出函數值.
比如階乘函數:f(n)=n*f(n-1)
在f(3)的運算過程中,遞歸的數據流動過程如下:
f(3){f(i)=f(i-1)*i}-->f(2)-->f(1)-->f(0){f(0)=1}-->f(1)-->f(2)--f(3){f(3)=6}
而遞推如下:
f(0)-->f(1)-->f(2)-->f(3)
由此可見,遞推的效率要高一些,在可能的情況下應盡量使用遞推.但是遞歸作為比較基礎的演算法,它的作用不能忽視.所以,在把握這兩種演算法的時候應該特別注意.
㈥ 求最小二乘法的遞推演算法
看《系統辨識》P62
㈦ 遞推演算法編程
int n = Convert.ToInt32(Console.ReadLine());
int count = 0;
if (n==1)
{
Console.WriteLine(1);
}
else if (n == 2)
{
Console.WriteLine(2);
}
else
{
for (int i = 2; i <= n; i++)
{
count += (n - i + 1);
}
Console.WriteLine(count + 1);
}
Console.ReadKey();
剛出爐的 演算法,
㈧ 數列遞推演算法的原理
什麼是遞推
所謂遞推,是指從已知的初始條件出發,依據某種遞推關系,逐次推出所要求的各中間結果及最後結果。其中初始條件或是問題本身已經給定,或是通過對問題的分析與化簡後確定。
從已知條件出發逐步推到問題結果,此種方法叫順推。
從問題出發逐步推到已知條件,此種方法叫逆推。
無論順推還是逆推,其關鍵是要找到遞推式。這種處理問題的方法能使復雜運算化為若干步重復的簡單運算,充分發揮出計算機擅長於重復處理的特點。
遞推法是一種重要的數學方法,在數學的各個領域中都有廣泛的運用,也是計算機用於數值計算的一個重要演算法。
遞推演算法的首要問題是得到相鄰的數據項間的關系(即遞推關系)。遞推演算法避開了求通項公式的麻煩,把一個復雜的問題的求解,分解成了連續的若干步簡單運算。一般說來,可以將遞推演算法看成是一種特殊的迭代演算法。
遞推的特點
可用遞推演算法求解的題目一般有以下兩個特點:
1、問題可以劃分成多個狀態;
2、除初始狀態外,其它各個狀態都可以用固定的遞推關系式來表示。
在我們實際解題中,題目不會直接給出遞推關系式,而是需要通過分析各種狀態,找出遞推關系式。
【例1】數字三角形。
如下所示為一個數字三角形。請編一個程序計算從頂到底的某處的一條路徑,使該路徑所經過的數字總和最大。只要求輸出總和。
1、 一步可沿左斜線向下或右斜線向下走;
2、 三角形行數小於等於100;
3、 三角形中的數字為0,1,…,99;
測試數據通過鍵盤逐行輸入,如上例數據應以如下所示格式輸入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
【演算法分析】
此題解法有多種,從遞推的思想出發,設想,當從頂層沿某條路徑走到第i層向第i+1層前進時,我們的選擇一定是沿其下兩條可行路徑中最大數字的方向前進,為此,我們可以採用倒推的手法,設a[i][j]存放從i,j 出發到達n層的最大值,則a[i][j]=max{a[i][j]+a[i+1][j],a[i][j]+a[i+1][j+1]},a[1][1] 即為所求的數字總和的最大值。
//【參考程序】
#include<iostream>
using namespace std;
int main(){
int n,i,j,a[101][101];
cin>>n;
for (i=1;i<=n;i++)
for (j=1;j<=i;j++)
cin>>a[i][j]; //輸入數字三角形的值
for (i=n-1;i>=1;i--)
for (j=1;j<=i;j++)
{
if (a[i+1][j]>=a[i+1][j+1]) a[i][j]+=a[i+1][j]; //路徑選擇
else a[i][j]+=a[i+1][j+1];
}
cout<<a[1][1]<<endl;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
思考
如果要輸出最大和的路徑該怎麼處理呢?
【例2】 骨牌問題
有2 × n的一個長方形方格,用一個1 × 2的骨牌鋪滿方格。
編寫一個程序,試對給出的任意一個n(n>0), 輸出鋪法總數。
【演算法分析】
(1)面對上述問題,如果思考方法不恰當,要想獲得問題的解答是相當困難的。可以用遞推方法歸納出問題解的一般規律。
(2)當n=1時,只能是一種鋪法,鋪法總數有示為x1=1。
(3)當n=2時:骨牌可以兩個並列豎排,也可以並列橫排,再無其他方法,如下左圖所示,因此,鋪法總數表示為x2=2;
(4)當n=3時:骨牌可以全部豎排,也可以認為在方格中已經有一個豎排骨牌,則需要在方格中排列兩個橫排骨牌(無重復方法),若已經在方格中排列兩個橫排骨牌,則必須在方格中排列一個豎排骨牌。如上右圖,再無其他排列方法,因此鋪法總數表示為x3=3。
由此可以看出,當n=3時的排列骨牌的方法數是n=1和n=2排列方法數的和
㈨ 遞推的遞推演算法
【例1】
植樹節那天,有五位同學參加了植樹活動,他們完成植樹的棵樹都不相同。問第一位同學植了多少棵時,他指著旁邊的第二位同學說比他多植了兩棵;追問第二位同學,他又說比第三位同學多植了兩棵;... 如此,都說比另一位同學多植兩棵。最後問到第五位同學時,他說自己植了10棵。到底第一位同學植了多少棵樹?
分析:設第一位同學植樹的棵樹為a1,欲求a1,需從第五位同學植樹的棵數a5入手,根據「多兩棵」這個規律,按照一定順序逐步進行推算:
(1) a5=10;
(2) a4=a5+2=12;
(3) a3=a4+2=14;
(4) a2=a3+2=16;
(5) a1=a2+2=18;
Pascal程序:
Program Examl;
Var i,a:byte;
begin
a:=10;
for i:= 1 to 4 do
a:=a+2;
writeln('The Num is' ,a);
readln;
end.
本程序的遞推運算可用下圖示表示:
初始值a:=10 ----- i=1,a=a+2(12) ----- i=2,a=a+2(14) ------ i=3,a=a+2(16) ----- i=4,a=a+2(18) ---- 輸出a值
例2:
十本不同的書放在書架上。現重新擺放,使每本書都不在原來放的位置。有幾種擺法?
當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用M(n)表示,那麼M(n-1)就表示n-1個編號元素放在n-1個編號位置,各不對應的方法數,其它類推.
第一步,把第n個元素放在一個位置,比如位置k,一共有n-1種方法;
第二步,放編號為k的元素,這時有兩種情況.1,把它放到位置n,那麼,對於剩下的n-2個元素,就有M(n-2)種方法;2,不把它放到位置n,這時,對於這n-1個元素,有M(n-1)種方法;
綜上得到
M(n)=(n-1)[M(n-2)+M(n-1)]
遞推演算法以初始(起點)值為基礎,用相同的運算規律,逐次重復運算,直至運算結束。這種從「起點」重復相同的方法直至到達一定「邊界」,猶如單向運動,用循環可以實現。遞推的本質是按規律逐次推出(計算)先一步的結果。
㈩ 遞推估計演算法的概述
遞推估計演算法recursive estimation algorithm
利用時刻t上的參數估計、存儲向量與時刻 t+1上測量的輸入和輸出值u(t+1)和y(t+1)計算新參數值(t+1),再根據(t+1)計算出新參數值(t+2),直到獲得滿意的參數值為止。這種演算法的每一步計算量都比較小,能夠使用小型計算機進行離線或在線參數估計,可以估計時變參數,也可以實時估計適應控制器的參數(見適應控制系統)。20世紀60年代,遞推估計演算法得到迅速發展,到了70年代產生了許多不同的方法,例如,有離線方法的各種變形、卡爾曼濾波法、隨機逼近方法和模型參考適應參數遞推估計法等。
遞推估計演算法的各種方法可以用一個統一的公式來描述: