1.遞歸的定義
簡單的來說,遞歸就是一個概念能夠用自身來解釋,比如說一本字典,每個字詞的解釋是依靠字典中其他的字詞來解釋的。一般來說,計算機中遇到的遞歸問題大多是把一個問題分解成規模更小的子問題求解,再進行合並。
遞歸的性質
一個具有遞歸性質的問題,大多具有兩個特征,第一個是狀態轉移方程也就是遞歸方程,比如在求解階乘時,n!=n*(n-1)!,就將求解n的階乘轉換為求解n-1的階乘。第二個特征就是終止條件,一個遞歸是一類問題的求解,必定有一個結果
無法一只遞歸下去,有一個結束條件,也就是當問題規模簡化的足夠小的時候可以直接的出答案。在求解階乘時,當問題過為1的時候就直接輸出1.
int f(n)
{
if(n==1)//終止條件
{
return 1;
}
else
{
return n*f(n-1);//遞歸方程
}
}
遞歸的代價
遞歸執行時,遞歸函數會被反復地調用,一層一層的進入,到達終止條件后,再一層一層出來,為了保證結果的正確性,每一層函數的運算結果和狀態都必須保存在系統所分配的棧里面,當數據量很大的時候,遞歸所占用的空間和運行時間會非常恐怖,效率也很低
這里再介紹一種和遞歸類似的但執行效率更高的動態規划算法。
動態規划的性質
遞歸算法是從頂置低求解問題,而·動態規划算法是從低置頂求解問題,同樣也需要狀態轉移方程方程,和初始條件,相較於遞歸算法的優勢,動態規划算法不需要反復調用自身函數,也不需要儲存每一層函數的狀態,故而時間花費和空間花費都要少的多。
階乘的動態規划算法
int f(n)
{
int array[n+1],i;//array[i]表示i的階乘
array[1]=1;
for(i=2;i<=n;i++)
{
array[n]=n*array[n-1];//狀態轉移方程
}
return array[n];
}
此算法,無論是時間,還是在空間上都優於遞歸算法。但是針對某些問題,遞歸算法代碼量更少,更好理解,比如漢諾塔,若用動態規划算法求解,時間消耗雖遠遠小於遞歸算法,但實現難度卻也大於遞歸算法。 個人觀點,歡迎大家討論,斧正
