2014-01-29 132 views
0

好吧,所以繼承人我簡單的計算最大的公約數。它每次和46332964一樣返回一個垃圾值。我認爲我的頭一個小時,但似乎無法理解這個問題。經過研究,我還包括原型,但仍然沒有運氣。它工作,直到它返回。請複製代碼並運行它,請幫助我。C++,遞歸正確的答案,但不能正確返回

#include <iostream> 
using namespace std; 

int calculate_gcd(int aa, int bb, int rem, int g); 

int main() 
{ 
    int a, b; 
    int rem = -1; 
    int gcd=0; 

    cout << "Number 1: "; //taking inputs 
    cin >> a; 
    cout << "Number 2: "; 
    cin >> b; 

    if (a < b) //swapping if number greater than the number according to the code 
    { 
     a = a + b; 
     b = a - b; 
     a = a - b; 
    } 

    gcd = calculate_gcd(a, b, rem, gcd); 

    if (a <= 0 || b <= 0) 
    { 
     rem = 0; 
     cout <<"GCD doesnot exists\n"; 
    } //just in case of zeros 
    else 
     cout << "\nthe GCD of "<<a <<" and "<<b <<" is "<<gcd <<"\n\n"; //the main answer 

    system("pause"); 
    return 0; 
} 

int calculate_gcd(int aa, int bb, int rem, int g) 
{ 
    if (rem != 0) 
    { 
     if (aa%bb == 0) 
     { 
      rem = 0; 
      g = bb; 
      printf("**GCD is %d\n", g); 
     } 
     else { 
      rem = aa % bb; 
      aa = bb; 
      bb = rem; 
     } 
     calculate_gcd(aa, bb, rem, g); 
    } 
    else { 
     printf("**here also GCD is correct as %d \n", g); 
     return g; //returning 
     } 
} 

回答

1

你錯過了一個回報。您應該使用return calculate_gcd(aa, bb, rem, g);而不是僅遞歸。

你可以使用-Wreturn-type與clang捕捉到這個。其他編譯器可能也會對此提出警告。

+0

謝謝。似乎工作。我將遞歸行更改爲「return calculate_gcd(aa,bb,rem,g);」 也讓g返回;留。 但爲什麼?似乎很難想到這個:( – TREMOR

+1

'calculate_gcd'的類型是'int(int aa,int bb,int rem,int g)'這意味着,給定'aa','bb','rem' ,'g',你*承諾*返回一個'int',如果你的函數決定遞歸,它會調用該函數的一個新的拷貝,但它不會讓你失去返回一個整數的承諾。事實上,當你說你會導致未定義的行爲時,不會返回一個整數。 – rmcclellan

2

函數頭

int calculate_gcd(int aa, int bb, int rem, int g) 

指定g由值通過。

這意味着在一次調用中,將指定的值複製到此函數調用’的本地g。對本地g的更改對呼叫站點沒有影響。

相反,你應該return函數的結果,然後你不’噸需要g說法:

int calculate_gcd(int aa, int bb, int rem) 

仔細分析會告訴你,你並不真的需要rem說法要麼,所以:

int calculate_gcd(int aa, int bb) 

順便,作爲一個初學者如果使用C++ iostreams(如cout),而不是像printf這樣的低級別C I/O函數,將會大大受益。那’因爲printf和家人不執行任何類型檢查,所以它很容易出錯。

此外,雖然這聽起來可能只是禿頂,但通過垂直正確排列內容,即使用100%一致的縮進,您將受益匪淺。幸運的是,有免費的工具可以幫助解決這個問題。如果您最喜愛的IDE或編輯器不支持自動源代碼格式,請查看免費的AStyle程序。

+0

謝謝,我可能明白這一點,明天我會試試這個,因爲在這裏睡覺時間,然後選擇一個正確答案 – TREMOR

相關問題