使用递归时如何避免初始化变量?

时间:2017-03-30 10:56:58

标签: c recursion graph initialization

我使用递归函数,但我正在初始化一个存储函数内值的队列。我希望每次使用递归时都避免初始化队列,因为那时我丢失了需要存储的值。不幸的是,我给出的代码的结构是这样的,我无法修改函数定义。

void function(Graph* graph, int edge_id) {

    Queue * queue = new_queue();

    Edge* temp = graph->vertices[edge_id]->first_edge;

    while(temp!=NULL){
        queue_enqueue(queue, temp->v);
        temp=temp->next_edge;
    }
    queue_print(queue);

    if(temp == NULL){
        function(graph, queue->elements->head->data);
    }

2 个答案:

答案 0 :(得分:4)

只需创建另一个函数并将其调用为函数:) 由于这个'技巧',你不会改变名为function

的功能
void function_b(Graphe *graph, int edge_id, Queue *queue) {

    Edge* temp = graph->vertices[edge_id]->first_edge;

    while(temp!=NULL){
        queue_enqueue(queue, temp->v);
        temp=temp->next_edge;
    }

    queue_print(queue);

    if(temp == NULL){
        function_b(graph, queue->elements->head->data, queue);
    }

}

void function(Graph* graph, int edge_id) {
    Queue * queue = new_queue();
    function_b(graph, edge_id, queue);
}

答案 1 :(得分:1)

您需要使您的队列保持静态,这样它将在您对函数的多次调用中生存,并且只能初始化一次。这里有很多关于静态的问题和答案。

    void function(Graph* graph, int edge_id) {
        static Queue * queue = NULL;
        if (queue == NULL) {
            queue = new_queue();
        }

        Edge* temp = graph->vertices[edge_id]->first_edge;

        while(temp!=NULL){
            queue_enqueue(queue, temp->v);
            temp=temp->next_edge;
        }
        queue_print(queue);

        if(temp == NULL){
            function(graph, queue->elements->head->data);
        }
    }