我理解 if (*(s+1)),指向数组下一个元素的指针,直到它变为 NULL,但我不明白为什么函数返回数组的反转。你能解释一下吗。
void reverse(const char* s) {
if (*(s + 1))
reverse(s + 1);
std::cout << *s;
}
int main()
{
char Arr[100] = {"Я изучаю язык программирования С++"};
reverse(Arr);
return 0;
}
好吧,看,只要有符号,它们就会作为局部变量参数被压入堆栈。然后他们一一出来。但是输出是在堆栈上的所有字符之后执行的......
让字符串abc
指向a的指针存储在变量中,并且b的函数被递归调用。它存储在一个变量中,c的函数被递归调用。它存储在一个变量中,不会为空字符递归调用该函数 - 只是一个返回。
显示最后一次通话的符号,即 与. 退出函数,返回到第二次调用,对于b。输出b,函数退出,返回第一次调用,对于a。输出一个。完全退出递归。
这更清楚吗?
这是正常的递归。尝试在一些短字符串上手动传递代码,例如,三个字符长。
走着瞧吧。
字符串始终以空值结尾。
首先,该函数
reverse
在三个字符的字符串上调用。检查字符串的下一个(第二个)字符是否非零,并在双字符字符串上调用自身。再次检查下一个字符 - 不为空。在单个字符串上调用自身。检查 - 下一个字符为零。然后打印字符串的当前(最后一个)字符并将控制权返回给调用者。也就是说,对于它自己,但在递归的前一步。在那里,它为此步骤输出字符串的当前(倒数第二个)字符,并再次返回到上一步。
最后输出字符串的第一个字符,并返回函数
main
一张图片而不是一千个字。添加调试打印:
该函数的伪代码:“打印字符串意味着打印字符串的尾部,打印它的第一个字符”。显然,字符串的第一个字符最后打印。在人类语言中 - 该行向后打印。