2013-02-23 33 views
0

修改我的反向字符串函數以添加遞歸。不幸的是,我的程序一直在爆炸。程序使用遞歸後炸掉

在Visual Studio中遍歷我的代碼,由於某種原因,監視窗口會說我等於字符串的長度(即退出while循環的終止條件)。我最後一次繼續它,它說我現在比字符串長度少了一個。然後它永遠留在while循環中。

我知道這聽起來令人困惑,所以我會舉個例子。我輸入「海綿寶寶」,它做我想要的一切(即說海綿寶寶的長度是9,打印「bobegnopS」,增加我的字符​​串長度等),但它說我現在是8(即它是隻是在9)並且永遠不會退出while循環。

這裏是我的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); 
    } 
    }  

這裏是呼叫:

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 2013-02-23 03:57:03

+0

你的意思是我不能讓ReverseString成爲無效的,因爲它是一個遞歸函數?所以我應該使它char * ReverseString使它返回一個字符指針? – MrPickle5 2013-02-23 03:59:13

+2

我不是指返回類型,void函數仍然可以返回; – billz 2013-02-23 04:00:33

回答

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

沒有在循環裏修改istringLength(功能ReverseString通過值需要他們,而不是引用。)所以它永遠不能終止。

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); 
} 

事實你需要返回一個值不會改變你需要停止條件的事實,否則你的遞歸函數將永遠不會停止。