2016-12-06 83 views
0

我最近開始學習C和編程,最近我們被告知要製作一個程序,使用遞歸找到兩個數的GCD和LCM。C遞歸函數 - GCD

現在經過一番磨練,我設法把它們合在一起。

#include<stdio.h> 

int gcd(int a,int b); 

int main() 
{ 
    int a,b,l,temp; 
    printf("Enter two numbers :\n"); 
    scanf("%d%d",&a,&b); 
    if(a<b) 
    { 
     temp=a; 
     a=b; 
     b=temp; 
    } 
    l=gcd(a,b); 
    printf("GCD = %i\nLCM = %i",l,a*b/l); 

    return 0; 
} 

int gcd(int a,int b) 
{ 
    static int c; 
    c=a%b; 
    a=b; 
    b=c; 
    if(c!=0) 
    { 
     gcd(a,b); 
    } 
    else 
     return a; 
} 

現在由於某種原因,我不知道,該功能不工作沒有「其他」。更特別的是這樣的:

int gcd(int a,int b) 
{ 
    static int c; 
    c=a%b; 
    a=b; 
    b=c; 
    if(c!=0) 
    { 
     gcd(a,b); 
    } 
     return a; 
} 

儘管與作業無關,我覺得我應該明白這裏的問題是什麼。作爲新手,我會感謝任何和所有的幫助。

如果問題太愚蠢或代碼太雜亂,請提前道歉。

+0

爲什麼遞歸函數「static」中的局部變量?他們不應該。 –

+2

'if(c!= 0)'分支不返回值。 –

+1

並且調用'gdc'會丟棄返回的值。 –

回答

0

的問題是遞歸調用:

int gcd(int a,int b) 
{ 
    static int c; 
    c=a%b; 
    a=b; 
    b=c; 
    if(c!=0) 
    { 
     gcd(a,b); // The problem is here 
    } 
    else 
     return a; 
} 

你已經做了兩種不同的方法:

  1. 在上述情況下,你沒有return語句,如果c!=0。你的函數返回int。通常編譯器會給你一個警告,因爲你會返回一個隨機數see here。所以,讓我們說這是運氣,你的功能與其他作品。
  2. 沒有else語句你會總是返回a。你計算gcd,但你永遠不會使用結果,所以你的第一次調用的結果將永遠是你的main的a和b之間的較小數字。您需要使用遞歸調用的結果來使該函數正常工作。

正確的做法是返回像桑傑 - SOPHO的遞歸調用你的結果已經說過:

return gcd(a,b); 

此外,它是使用在牙齒矯正不良的編碼風格的,如果和在其他沒有大括號;)兩種情況都很好,但保持一致。

0

您詢問了代碼中的問題。這裏,

static int c; 

爲什麼它是靜態的,此外,你不需要第三個變量來計算gcd使用遞歸。 而且,

gcd(a,b); 

你在哪個變量返回gcd。這根本沒有意義。它不是一個void函數,它返回一個int。

現在正確的方法,

if (b != 0) 
    return gcd(b, a%b); 
    else 
    return a; 

就是這樣。

+0

這個靜態實際上是我之前嘗試過的其他東西的剩餘物。沒有真正想過去除它。 此外,我只是使用gcd(a,b)來通過歐幾里德算法。只需遍歷並賦值,然後在c(餘數)變爲0並返回a時停止遞歸。 就像我說的,對於C來說還是比較新的,而且對於遞歸更是如此。 –