Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 使用递归时如何避免初始化变量?_C_Recursion_Graph_Initialization - Fatal编程技术网

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

C 使用递归时如何避免初始化变量?,c,recursion,graph,initialization,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!=NU

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

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);
    }

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

    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);
        }
    }

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

    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);
        }
    }

只需创建另一个函数并将其调用到函数:) 由于该“技巧”,您不会更改名为
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);
}

只需创建另一个函数并将其调用到函数:) 由于该“技巧”,您不会更改名为
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);
}


您不能修改该函数,但可以执行另一个函数,该函数将使用:)
function\u bis(Graph*Graph,int-edge\u id,Queue*Queue)不要初始化在函数中存储值的队列。更改函数名并添加队列指针作为参数。创建一个与原始函数同名并采用原始参数的新函数。在那里,创建队列并调用旧函数。重新编译,重新生成。@Harambe请不要忘记投票并验证答案;)@kaldoran有没有办法验证某个特定的答案?@Harambe只需在回答者的下一票按钮下打勾即可。你不能修改该函数,但你可以使用另一个函数:)
function\u bis(Graph*Graph,int-edge\u-id,Queue*Queue)不要初始化在函数中存储值的队列。更改函数名并添加队列指针作为参数。创建一个与原始函数同名并采用原始参数的新函数。在那里,创建队列并调用旧函数。重新编译,重新生成。@Harambe请不要忘记投票并验证答案;)@kaldoran有没有办法验证某个特定的答案?@Harambe只要在回答者的“向下投票”按钮下打勾就行了是的——这就是我要做的。简单又安全。是的,那就是我要做的。简单且安全。没错,但这直接回答了原始帖子,是否存在架构问题是一个更广泛的问题:-)知道这也不是坏事,递归函数通常需要这样的东西。嗯,任何向OP的代码添加约束的解决方案都应该突出显示:)@kaldoran answer不使用静态,因此不引入单线程约束。尝试了两种解决方案后,这对我来说效果最好。非常感谢。请注意,如果您有一个部分满的队列,第二次调用该函数将不会很好地工作。另一种解决方案更可取@Harambe好奇:你是如何确定的?没错,但这直接回答了原始帖子,是否存在架构问题是一个更广泛的问题:-)知道这也不是一件坏事,递归函数通常需要这样的东西。嗯,任何向OP的代码添加约束的解决方案都应该突出显示:)@kaldoran answer不使用静态,因此不引入单线程约束。尝试了两种解决方案后,这对我来说效果最好。非常感谢。请注意,如果您有一个部分满的队列,第二次调用该函数将不会很好地工作。另一种解决方案更可取@哈拉姆:你是怎么决定的?