遞歸算法

以前學VB的時候看過關於遞歸算法的一些教程,但是那個時候愣是看不懂,今天重看了C的寫法,大概懂了,寫下來,但是記憶加深。

遞歸算法必須滿足以下三個條件纔可以成立。
1.具有規律性(基本上可以用for解決的),所求問題可以用同個法子解決。例如:
有5個數,a1,a2,a3,a4,a5,其中a5=a4+2,a4=a3+2,a3=a2+2,a2=a1+2。。。如果轉換成公式的話則爲aN=a(N-1)+2。
2.子問題的規模比原問題的小,規模應該是具有規律性的遞減。
3.必須有遞歸結束的條件。

簡單的例子,有5個數,a1,a2,a3,a4,a5,其中a5=a4+2,a4=a3+2,a3=a2+2,a2=a1+2,a1=10,求a5的值?
c語言(其他語言基本可以參考着實現)



#include <stdio.h>
void main()
{
int add(int n);  /*聲明函數*/
printf("%d \n",add(5));/* 打印結果 */
}
int add(int n)
{
    if(n==1) return 10; /* 如果n是1話,那麼返回結果10 */
    else return add(n-1)+2; /* 否則,返回 (n-1)+2 */
}

遞歸比較難以理解的地方在於函數自我調用的過程,但是如果用一個圖來解釋的話,那是比較容易看懂,一共分爲2個部分,第一部分是回朔,就是找到源頭,如果把本例的add(int n)函數進行圖解的話:

遞歸算法 - 80後 - 小草
函數首先會判斷N的值,如果不是1,就自我調用,而每次調用的時候,N的值都會遞減下去,一直到N=1,如果沒有N=1的情況,那麼程序會報錯。一旦N=1,函數就終止自我調用,返回一個具體的值,而這個具體的值再逐個代入到上一級的調用當中,最後計算出結果。如果用循環語句也可以實現,其實個人認爲大部分的時候遞歸可以完成的事情用循環語句都是可以解決的。所以如果會用循環的話,不用一直苛求一定要使用遞歸的算法,只要能解決問題就好。
附上本例的循環循環語句解法:

#include <stdio.h>

void main()
{
   int a=10;/*已知a1=10,從a2開始計算到a5,每次a等於上一個值+2*/
    for(int i=2;i<=5;i++)
{
     a+=2;
printf("%d",a);
}




 

發佈了102 篇原創文章 · 獲贊 7 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章