为什么此代码打印"olleH"?

Why does this code print "olleH"?

本文关键字:olleH 打印 代码 为什么      更新时间:2023-10-16

为什么这个程序打印"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);
    }
}

两件事:首先,术语:您编写的函数声明返回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位于字符串的开头)返回最后一个,递归调用在返回之前返回,最里面的函数调用(pos位于字符串的末尾)是第一个完全运行的函数。(这是因为递归调用仅为if (pos < size),并且此限制对于防止无限循环非常重要)。因此,在以pos开头的对function()的第一次调用中,如果它在再次调用function()以写入字符串的其余部分之前写入第一个字符,则字符串将按顺序排列。如果您在写入字符串的其余部分之后写入第一个字符,那么它将按相反的顺序,就像在两种不同的情况下一样。