为什么这个节目打印" 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);
}
}
答案 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()
之前写入第一个字符以写入字符串的其余部分,则字符串将按顺序排列。如果在写完字符串的其余部分之后编写第一个字符,那么它将以相反的顺序编写,就像在两种不同的情况下一样。