C++递归遍历链表时执行return后仍运行后续代码的疑问
递归函数执行逻辑疑问解答
你对return的理解本身没有错:return确实会直接退出当前正在执行的函数实例、忽略当前函数内后续的代码,你遇到的疑惑本质是没有搞懂「多层递归调用的栈执行逻辑」。
以你代码里的链表结构 A节点 -> B节点 -> C节点 -> NULL 为例,func1的完整调用顺序如下:
- 第一层调用:
func1(one)(head指向A节点)- head不为空,跳过return分支
- 执行cout,输出
A - 调用
func1(head->next)也就是func1(two),当前第一层函数暂停,等待第二层调用返回
- 第二层调用:
func1(two)(head指向B节点)- head不为空,跳过return分支
- 执行cout,输出
B - 调用
func1(head->next)也就是func1(three),当前第二层函数暂停,等待第三层调用返回
- 第三层调用:
func1(three)(head指向C节点)- head不为空,跳过return分支
- 执行cout,输出
C - 调用
func1(head->next)也就是func1(NULL),当前第三层函数暂停,等待第四层调用返回
- 第四层调用:
func1(NULL)- head为空,触发if判断,执行
return - 这个return仅退出第四层的func1实例,回到第三层调用
func1(head->next)的位置
- head为空,触发if判断,执行
- 回到第三层:
func1(head->next)执行完毕,第三层没有后续代码,自动return,回到第二层调用的位置 - 回到第二层:
func1(head->next)执行完毕,第二层没有后续代码,自动return,回到第一层调用的位置 - 回到第一层:
func1(head->next)执行完毕,第一层没有后续代码,自动return,回到main函数,整个调用结束
你疑惑的「return之后还执行cout和func1调用」是误解:触发return的是传入NULL的那层func1,这一层的cout和func1调用确实没有被执行。你看到的所有cout输出,都是前面几层还没执行到return的时候先执行的。
如果还不理解可以做个测试:把func1里的cout和func1调用的顺序调换,改成如下代码:
void func1(Node* head) { if (head == NULL) { return; } func1(head->next); cout << " " << head->value; }
这时输出结果会变成 C B A,就是因为每一层都会先等下一层return回来,才会执行当前层的cout语句,刚好可以验证递归栈的执行顺序。
内容的提问来源于stack exchange,提问作者CaesarHo
相关产品推荐
相关产品推荐

