为什么这个代码打印" olleH"?

时间:2016-05-02 01:12:57

标签: c++ recursion

为什么这个节目打印" olleH"?

看起来这个程序打印的确没有什么 - 但我似乎不明白递归是如何工作的。

#include "stdafx.h"
#include <iostream>
#include <string>

using namespace std;

void function(string, int, int);

int main()
{
    string mystr = "Hello";
    cout << mystr << endl;
    function(mystr, 0, mystr.size());

    system("pause");
    return 0;
}

void function(string str, int pos, int size)
{
    if (pos < size)
    {
        cout << str[pos];
        function(str, pos + 1, size);
    }
}

1 个答案:

答案 0 :(得分:2)

两件事:第一,术语:你写的函数声明返回void而不是string,但确实打印了一个字符串。其次,当你运行它时,你发布的代码打印出“Hello”。如果您在function()中切换这两行的顺序,我将假设您的问题与打印“olleH”的原因有关:

cout << str[pos]; //prints "Hello"
function(str, pos + 1, size);

与之相比:

function(str, pos + 1, size);//prints "olleH"
cout << str[pos];

正如您所说,这是递归。要理解这一点,您需要记住调用函数的顺序以及它们返回的相反顺序,将控制权传递给调用它们的函数。在字符串开头用function()第一次调用pos返回last,递归调用在它之前返回,最内层的函数调用在字符串末尾用pos是第一个完全跑步的人。 (这是因为递归调用只进行if (pos < size),这种限制对于防止无限循环非常重要。所以在开始时第一次调用function() pos时,如果它再次调用function()之前写入第一个字符以写入字符串的其余部分,则字符串将按顺序排列。如果在写完字符串的其余部分之后编写第一个字符,那么它将以相反的顺序编写,就像在两种不同的情况下一样。