2009-10-04 81 views
1
//This program finds the GCD of two numbers using a recursive function call via the 
//Euclidean algorithm 

#include <iostream> 
#include <cmath> 
using namespace std; 

int GCD (int A, int B); 

int main() 
{ 
    int A = 45, B = 55; 

    cout << "The GCD is " << GCD(A,B) << endl; 
    //test 
    return 0; 
} 

int GCD (int A, int B) 
{ 
    A = abs(A); 
    B = abs(B); 


    if (A > B) 
    { 
     A = A - B; 
     return GCD (A, B); //Recursive function call - works fine 
     //GCD (A, B); -- This function call seems to return an incorrect value 

    else if (A < B) 
    { 
     B = B - A; 
     return GCD (A, B);//Recursive function call 
     //GCD (A, B); -- This function call seems to return an incorrect value 
    } 

    else if (A = B) 
    { 
     return A; 
    } 
} 

這裏是我的問題:我注意到,如果我沒有在遞歸函數調用中使用「return」關鍵字,程序返回的值不正確,但是如果我單步執行該函數,本地值正確更新。我知道函數(除非它們是void類型)必須返回一個值。也許這個規則也適用於遞歸函數調用?基本C++遞歸程序問題

有人請詳細說明/幫助我理解嗎?

+0

請問您能正確格式化您的代碼嗎?只需將其標記並按下Ctrl + K即可。 – mmmmmmmm 2009-10-04 13:52:16

+0

@Nick D:謝謝:-) – mmmmmmmm 2009-10-04 14:03:36

回答

0

使用return GCD(A,B);版本,呼叫GCD(A,B)的結果返回給父級。如果您跳過return語句,則返回的結果將丟失,並且不會傳遞給GCD()的調用調用。

也就是說,在「C」中,您必須使用return語句作爲函數返回值。

1

I know that functions (unless they are of the type void) must return a value. Perhaps this rule applies in recursive function calls as well?

是的,它的確如此。如果你不使用return語句,函數的返回值是未定義的。

3

如果你沒有返回一個值,那麼它是未定義的返回值。因此,如果if/else沒有匹配,則返回不可預知的值(取決於編譯器/編譯器標誌/運行程序的當天時間/ ...)。 所以調用方法會計算錯誤的結果。

這對於遞歸和非遞歸方法和函數都是如此。

7

Perhaps this rule applies in recursive function calls as well?

爲什麼要應用不同的規則?遞歸函數正常正常功能。

順便說一句,你的程序包含一個錯誤:

else if (A = B) 
{ 
    return A; 
} 

這是不是一個比較,這是一個任務 - 和另外的測試是不必要的,因爲所有其他條件(A < BA > B)已經測試。

0

「或許這條規則適用於遞歸調用以及」

當然,遞歸是不是一個特例。你的函數需要返回一些東西,在這種情況下,它是需要返回的遞歸調用的返回值。

還有另一種無聲的錯誤:你寫(A == B)

+0

@rstevens - 謝謝你指出。我會從這裏開始。 謝謝!我很欣賞你的回覆! 我不能相信我做了A = B而不是A == B比較。你能告訴我是一個小白菜:) 再次感謝! – noobzilla 2009-10-04 14:02:44

1

讓你的頭左右,這是因爲嵌套函數調用的方式(A = B)insteadl。外部GCD稱爲內部GCD,內部GCD又稱爲內部GCD。當你到達最內層的調用(A == B的調用)時,你將返回A,並且該返回將傳播你返回的所有值,直到它到達最外面的GCD,這將返回正確的值。如果沒有收益,內心呼聲的結果將永遠不會對外界產生影響。

試着寫下函數用簡單的值做什麼,你會看到這種嵌套行爲。

編輯:如果您一直在使用Lisp,您可能會感到困惑,因爲Lisp會自動返回函數的最後一行。