此递归函数输出什么?

时间:2019-04-03 00:55:59

标签: recursion

我刚刚开始学习递归,但我不理解输出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 << “ ”;
 }
}

1 个答案:

答案 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,您可能会更好地理解它。