删除递归void函数

时间:2013-11-25 04:24:47

标签: c recursion void

有人可以帮我删除这个void函数的递归吗?它在某些情况下不起作用。我已经尝试但我无法得到。谢谢。资料来源:http://www2.dcc.ufmg.br/livros/algoritmos/implementacoes-07.php

void ImprimeCaminho(TipoValorVertice Origem, TipoValorVertice v, 
            TipoGrafo *Grafo, int * Dist, TipoCor *Cor,  
            int *Antecessor)
{ if (Origem == v) { printf("%d ", Origem); return; }
  if (Antecessor[v] == -1)
  printf("Nao existe caminho de %d ate %d", Origem, v);
  else { ImprimeCaminho(Origem,Antecessor[v], 
                        Grafo, Dist, Cor, Antecessor);
         printf("%d ", v);
       }
} 

1 个答案:

答案 0 :(得分:1)

您显示的功能需要某种堆栈,您可以使用数组实现。这是一个使用固定大小数组的示例,其中assert()它永远不会溢出 - 这大致相当于原始的递归算法,因为本身没有错误检查也没有过多的递归,但是你显然可以用一些更强大的错误处理(甚至是调整大小的动态分配)来代替它。

void ImprimeCaminho(TipoValorVertice Origem, TipoValorVertice v, 
            TipoGrafo *Grafo, int * Dist, TipoCor *Cor,  
            int *Antecessor)
{
    int Vertices[MAX_VERTEX];
    int n = 0;

    while (1)
    {
        if (Origem == v)
        {
            printf("%d ", Origem);
            break;
        }

        if (Antecessor[v] == -1)
        {
            printf("Nao existe caminho de %d ate %d", Origem, v);
            break;
        }

        assert(n < sizeof Vertices);
        Vertices[n++] = v;
    }

    while (n > 0)
        printf("%d ", Vertices[--n]);
} 
相关问题