这段代码怎么能被颠倒过来? (递归)

时间:2016-03-28 08:57:06

标签: c++ visual-c++ recursion

得到Pierre Fourgeaud(互联网)的代码,但我无法理解它是如何被逆转的?

void reverse( string& word )
{
    if ( word.size() <= 1 ) return;

    // Get the string without the first and the last char
    string temp = word.substr( 1, word.size() - 2 );

    // Reverse it
    reverse( temp );

    // Recompose the string
    word = word.substr( word.size() - 1 ) + temp + word[0];
}

1 个答案:

答案 0 :(得分:0)

显然,这是让你感到困惑的递归。所以,这是一个例子:

string word = "world";
  • 第一次递归会将"world"拆分为:"w" , "orl" and "d",它会将"orl"传递给第二次递归。
  • 第二次递归会将"orl"拆分为:"o" , "r" and "l",它会将"r"传递给第三次递归。
  • size of "r" <= 1起,第三次递归将不执行任何操作。而且,现在你回到第二次递归
  • 第二次递归现在将交换"o""l",并保持"r"不变,这意味着:"lro",这会回到第一次递归。
  • 最后,第一次递归会交换"w""d"并保持"lro"不变,这意味着:"dlrow"。哪个是"world"
  • 的逆转