close
for迴圈 VS 遞迴
所謂for迴圈也可以說成非遞迴(Non-Recursion),而遞迴(Recursion)非遞迴他們 之間的優缺,我由圖示來做個比較ˋ~~

  遞迴 非遞迴
優點

1.程式簡潔明確

2.節省記憶體空間

3.表達較強

4.區域變數與暫存變數較少

1.較節省執行時間

2.不需額外的Stack空間

缺點

1.執行時參數的存取較費時

2.需額外堆疊(Stack)空間支援

1.程式較長

2.浪費記憶體空間

3.表達力較弱

4.區域變數與暫存變數較多

 

舉個簡單例子~~

 

/*階乘用for*/
#include <stdio.h>
int main()
{
    int math;
    printf("請輸入一個整數:");
    scanf("%d",&math);
    int i,result=1;
    for(i=1;i<=math;i++)
    {
        result = result * i;
    }
    printf("階乘為:%d",result);
}

很解單就解決了~

/*階乘用遞迴*/
#include <stdio.h>
int factorial(int); /*良好習慣,易讀,不亂*/
int factorial(int n)
{
    if(n > 0)
        return( n  *  factorial(n-1) );
    else
        return (1);
}
int main()
{
    int math;
    printf("請輸入一個整數:");
    scanf("%d",&math);
    printf("階成為:%d",factorial(math));
}

兩者比較下來,對於初學者來說,for比較好理解,所以我就先來解釋一下遞迴的一些觀念。
看過我的基本函數的朋友,多少會了解到結構的狀況,依個人喜好,
我喜歡先宣告玩int factorial(int);,
之後再用函數int factorial(int n){*********},
當然有它的好處,良好習慣,易讀,不亂....等等,為了面對以後的大程式,這樣也比較好看。
想用到factorial()函數,當然就要呼叫他, 再把一個整數丟進去factoral函式 ,例如我丟3:
1. 3>0,3*factorial(2),又被呼叫。
2. 2>0,2*factorial(1),,又被呼叫。
3. 1>0,1*factorial(0),變成0時n>0不成立;所以變成else的答案,factorial(0)=1。
4.知道factorial(0)=1後,將1,2,3,反推回去~~
5.factorial(3)就得出答案啦~~
 
打鐵趁熱再來一題~

 

/*最大公因數for*/
#include <stdio.h>
#include <stdlib.h>
 
int main()
{
    int m, n;
    scanf("%d %d", &m, &n); //輸入兩值,空白隔開 
 
    while(n != 0)
    {
        int r = m % n;
        m = n;
        n = r;
    }
    printf("%d\n", m);
    return 0;
}

先別往下滑,如果是遞迴呢?

/*最大公因數遞迴*/
#include <stdio.h>
#include <stdlib.h>
int gcd(int,int);
int main()
{
    int m, n;
    scanf("%d %d", &m, &n);
    printf("%d",gcd(m,n));
}
int gcd(int vm,int vn)
{
    return( vn==0 ? vm : gcd(vn ,vm % vn) );
}

?和:是啥,請看基本函數篇
如果你食其味,再好好想想最小公倍數吧~~

 

/*最小公因數遞迴*/
#include <stdio.h>
#include <stdlib.h>
 
int gcd(int vm, int vn) {
    return(vn==0 ? vm : gcd(vn ,vm % vn));
}
 
int lcm(int m, int n) {
    return m * n / gcd(m, n);
}
 
int main(void) {
    int m, n;
    scanf("%d %d", &m, &n);
    printf("Lcm : %d\n", lcm(m, n));
 
    return 0;
}
如果你用for迴圈寫最小公倍數,就有些亂~~
等到你出師,玩uva的題目時,就知道遞迴的好處。
arrow
arrow
    全站熱搜
    創作者介紹
    創作者 佑佑 的頭像
    佑佑

    佑佑的語言

    佑佑 發表在 痞客邦 留言(0) 人氣()