【问题标题】:Problem while transforming an iterative function that prints a Queue into a recursive one将打印队列的迭代函数转换为递归函数时出现问题
【发布时间】:2020-07-05 21:55:48
【问题描述】:

我有这个显示队列的迭代函数:

void displayQueue(queue *Q){

     int temp;

     while(!isEmpty(Q)){
         temp = dequeue(Q);
         printf("%d -> ", temp);
         displayQueue(Q);
         enqueue(Q, temp);
     }

     reverse(Q);
}

我想通过删除 while 循环使其完全递归,这是我目前得到的:

void displayQueue(queue *Q){

    if(isEmpty(Q)) return;

    int temp = dequeue(Q);
    printf("%d -> ", temp);
    displayQueue(Q);
    enqueue(Q, temp);
}

问题是何时调用“reverse(Q)”函数,该函数必须在函数返回时在打印结束时调用,但此时 Q 为空,因此它不会被反转(打印队列导致其反转)

这是我的队列结构:

typedef struct queue{
  unsigned capacity;
  int size;
  int front;
  int rear;
  int *array;
}queue;

【问题讨论】:

  • 您能否展示一下您的queue 结构?仅仅为了打印而改变队列并不是最好的方法。通常显示函数应该只是遍历而不是修改。但是没有看到queue结构就不能给出更具体的指导。
  • @user13121591 "问题是什么时候调用"reverse(Q)" " - 有什么问题?
  • @kaylum 我添加了队列的结构,作为一个队列并将其视为我们只能访问头部中的元素
  • @VladFromMoscow 问题是 reverse(Q) 应该在函数返回之前调用,但此时 Q 是空的,所以它不会被反转
  • @Armali enqueue在队列后面添加一个元素,dequeue在队列前面删除元素

标签: c recursion queue function-definition


【解决方案1】:

这个函数看起来应该是这样的

void displayQueue( queue *Q )
{
    if ( !isEmpty( Q ) )
    {
        int temp = dequeue( Q );
        printf( "%d -> ", temp );

        displayQueue( Q );

        reverse( Q );
        enqueue( Q, temp );
        reverse( Q );
    }
}

如果您想避免频繁地反转队列,那么您可以使用静态变量编写函数,例如

void displayQueue( queue *Q )
{
    static int state = 0;

    if ( !isEmpty( Q ) )
    {
        int to_reverse = state ^ 1;
        if ( to_reverse ) state = to_reverse;

        int temp = dequeue( Q );
        printf( "%d -> ", temp );

        displayQueue( Q );

        enqueue( Q, temp );

        if ( to_reverse )
        {
            reverse( Q );
            state = 0;
        }
    }
}

没有静态变量,您可以编写将其拆分为两个函数的函数。第一个调用递归函数并反转结果。第二个是显示队列的递归函数。

例如

void recursiveDisplayQueue( queue *Q )
{
    if ( !isEmpty( Q ) )
    {
        int temp = dequeue( Q );
        printf( "%d -> ", temp );

        recursiveDisplayQueue( Q );

        enqueue( Q, temp );
    }
}

void displayQueue( queue *Q )
{
    if ( !isEmpty( Q ) )
    {
        recursiveDisplayQueue( Q );

        reverse( Q );
    }
}

【讨论】:

  • 这可行,但更改队列 3 次以打印它可能效率不高
猜你喜欢
  • 2020-08-08
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多