2013-02-23 2 views
0

재귀를 추가하려면 문자열의 역순 함수를 수정하십시오. 불행히도, 내 프로그램은 계속 날아 간다.재귀를 사용한 후의 프로그램 블로크

Visual Studio에서 내 코드를 밟았으며 어떤 이유로 시계 창이 i가 문자열 길이 (즉 while 루프를 종료하는 종료 조건)와 같다고 표시됩니다. 나는 지난 번에 그걸 밟았고, 이제는 내가 문자열 길이보다 하나 더 작다고 말한다. 그런 다음 그것은 while 루프에 영원히 남습니다.

나는이 소리가 혼란 스럽다는 것을 알고 있으므로 예제를 제공 할 것입니다. "Spongebob"을 입력하면 Spongebob의 길이가 9이고, "bobegnopS"가 인쇄되고 문자열 길이가 증가합니다.)하지만 지금은 8이라고 말합니다. 단지 9시에) while 루프를 종료하지 마십시오. 여기

내 ReverseString()의 함수 :

루프 내부
case 3: 
    //Learn By Doing 16.6 
    { 
     char string[BUFFER_LENGTH]; 
     bool stringReversed = false; 

     int base = 0; 
     int exponent = 0; 

     std::cout << "\nEnter base: " << std::endl; 
     std::cin >> base; 

     std::cout << "\nEnter exponent: " << std::endl; 
     std::cin >> exponent; 

     //Print pow 
     NewLine(); 
     std::cout << base << " to the " << exponent << " is " << pow(base, exponent); 

     //Reverse string using recursion 
     std::cout << "\nEnter string: " << std::endl; 
     std::cin >> string; 


     NewLine(); 
     int stringLength = strlen(string); 
     int i = 0; 
     ReverseString(string, stringReversed, stringLength, i); 

    } 
+0

ReverseString 함수에서 반환 지점이 필요합니다. – billz

+0

재귀 함수이기 때문에 ReverseString을 사용할 수 없다는 것을 의미합니까 ?? 그래서 그것을 char * ReverseString 문자 포인터를 반환하게해야합니까 ?? – MrPickle5

+2

반환 유형을 의미하지는 않지만 void 함수는 여전히 반환 할 수 있습니다. – billz

답변

1
void ReverseString(char * string, bool stringReversed, int stringLength, int i) 
{ 
    ... 
    while(i < stringLength) 
    { 
    string--; 
    std::cout << *string; 
    ReverseString(string, stringReversed, stringLength, i); 
    } 
} 

아무것도 수정되지 i 또는 stringLength은 (함수 ReverseString이 값들을 취 여기

void ReverseString(char * string, bool stringReversed, int stringLength, int i) 
{ 
    i++; 
    if(!stringReversed) 
    { 
     while(*string != '\0') 
     string++; 
    } 
    stringReversed = true; 

    while(i < stringLength) 
    { 
     string--; 
     std::cout << *string; 
     ReverseString(string, stringReversed, stringLength, i); 
    } 
    }  

통화 인 , 참조에 의한 것이 아닙니다.) 그래서 결코 끝낼 수 없습니다.

3

재귀 함수를 작성할 때 항상 중지 할 조건을 지정해야합니다. 순진한 계승 재귀 구현을 작성한다고 가정 해보십시오. 그래서 생각이처럼 계산하는 것입니다 : 당신이 순서로 보면

n! = n * (n-1) *...*2*1 

당신은 당신이 할 수있는 값으로 1 순진 재귀 구현을 중지 할 필요가 있음을 볼 수있다 : 사실

int factorial(int n) 
{ 
    // stop when we reached 1 
    // otherwise we never finish 
    if(n == 1) return 1; 
    // now do the magic 
    return n * factorial(n - 1); 
} 

값을 반환해야하는지 또는 중지 조건을 넣어야 하는지를 변경하지 않으면 재귀 함수가 중지되지 않습니다.

관련 문제