gpt4 book ai didi

c++ - 递归逆函数

转载 作者:太空狗 更新时间:2023-10-29 23:45:32 25 4
gpt4 key购买 nike

我想知道是否有人可以解释这个小代码片段是如何工作的。

void reverse(char *s)
{
if(*s)
reverse(s+1);
else
return;

cout << *s;
}

当您在 main 中调用此函数时,它应该会打印出输入的任何字符串的反转(即 hello 会输出为 olleh),但我不明白如何操作。据我了解,if 语句会增加 s 的值,直到它到达字符串的末尾,并打印出字符串中的每个值。为什么不重新打印字符串。显然我错过了一些东西。 (抱歉顺便说一句,我是 C++ 和递归函数的新手)

最佳答案

考虑一下 "hello" 字符串是如何存储在内存中的:假设它的 'h' 字符的地址恰好是 0xC000 .然后字符串的其余部分将存储如下:

0xC000 'h'
0xC001 'e'
0xC002 'l'
0xC003 'l'
0xC004 'o'
0xC005 '\0'

现在考虑 reverse 的一系列调用:初始调用传递 0xC000;从 reverse 内部调用 reverse 传递 s+1,所以下一级得到 0xC001;下一个得到 0xC002,依此类推。

请注意,每个级别都会调用下一个级别,直到看到'\0' 的级别。在我们归零之前,堆栈是这样“加载”的:

reverse(0xC004) // the last invocation before we hit '\0'
reverse(0xC003)
reverse(0xC002)
reverse(0xC001)
reverse(0xC000) // the earliest invocation

现在当 top 调用调用 reverse(0xC005) 时,*s 的检查失败,并且函数立即返回而不打印任何内容。此时堆栈开始“展开”,打印其 s 参数指向的任何内容:

0xC004 -> prints 'o', then returns to the previous level
0xC003 -> prints 'l', then returns to the previous level
0xC002 -> prints 'l', then returns to the previous level
0xC001 -> prints 'e', then returns to the previous level
0xC000 -> prints 'h', then returns for good.

这就是原始 "hello" 字符串的反向打印方式。

关于c++ - 递归逆函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18109057/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com