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不使用静态,因此不引入单线程约束。尝试了两种解决方案后,这对我来说效果最好。非常感谢。请注意,如果您有一个部分满的队列,第二次调用该函数将不会很好地工作。另一种解决方案更可取@哈拉姆:你是怎么决定的?