2009-10-04 2 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

+0

@ 닉 D : 감사합니다 :-) – mmmmmmmm

답변

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 if가 일치하지 않으면 예측할 수없는 값을 반환합니다 (프로그램을 실행하는 날의 컴파일러/컴파일러 플래그/시간에 따라 다름). 따라서 호출하는 메소드가 잘못된 결과를 계산합니다.

이것은 재귀 및 비 재귀 메서드 및 함수에 적용됩니다.

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를했다고 믿을 수 없다. 너는 내가 멍청하다고 말할 수 있니? Thanks Again! – noobzilla

1

이 중첩 된 함수 호출입니다 주위에 당신의 머리를 얻을 수있는 방법 (A = B) insteadl을 썼다. 외부 GCD는 내부 GCD를 호출하며 내부 GCD는 내부 GCD를 호출합니다. 가장 안쪽의 호출 (A == B 인 경우)에 도달하면 A를 반환하며, 가장 바깥 쪽 GCD에 도달 할 때까지 반환 값을 전달합니다. 그러면 올바른 값을 반환합니다. 반환이 없다면, 가장 내적인 호출의 결과는 결코 바깥 세계에 전달되지 않을 것입니다.

간단한 값으로 함수가 수행하는 작업을 기록해두면이 중첩 동작이 표시됩니다.

편집 : Lisp을 사용 중이라면 Lisp가 자동으로 함수의 마지막 줄을 반환하기 때문에 혼란 스러울 수 있습니다.