我刚刚开始学习递归,但我不理解输出39493。您能解释一下吗?
struct Node {
int value;
Node* next;
}
head-> 3-> 9-> 4-> NULL
void f4(Node* n) {
if(n == NULL)
return;
if(n->next == NULL)
cout << n->value << “ ”;
else {
cout << n->value << “ ”;
f4(n->next);
cout << n->value << “ ”;
}
}
答案 0 :(得分:0)
您的f4
函数将打印出一个由整数组成的链表,然后向前(从头/根到尾)进行打印,然后向后打印。这样做是因为f4
子句中else
的内部调用被两个cout
语句包围,这两个语句都将打印当前节点的值,并添加一个堆栈帧(新的执行上下文为下一个节点)。最后一个节点(尾部)被if(n->next == NULL)
捕获,并且此子句中只有一个cout
语句,因此尾部仅打印一次。
我添加了一个main
方法来说明这一点:
#include <iostream>
using namespace std;
struct Node {
int value;
Node* next;
};
void f4(Node* n) {
// This will never be reached
// except if f4 is called with NULL directly
if(n == NULL)
return;
if(n->next == NULL)
cout << n->value << endl;
else {
cout << n->value << endl;
f4(n->next);
cout << n->value << endl;
}
}
int main() {
cout << "Starting!" << endl;
Node n1 = {1, 0};
Node n2 = {2, &n1};
Node n3 = {3, &n2};
// get pointer to n3 -> n2 -> n1
f4(&n3);
return 0;
}
输出:
Starting!
3
2
1
2
3
要了解堆栈框架(递归调用)的处理机制: https://www.bottomupcs.com/elements_of_a_process.xhtml。
通过添加其他标记来区分不同行上的cout << n->value << endl
,您可能会更好地理解它。