2013-11-25 2 views
0

누군가가이 void 함수의 재귀를 제거하는 데 도움이 될 수 있습니까? 일부 상황에서는 작동하지 않습니다. 나는 시도했지만 얻을 수 없다. 고마워. 출처 : 당신이 보여준 기능은 당신이 배열을 사용하여 구현할 수있는 몇 가지 종류의 스택을 필요로 http://www2.dcc.ufmg.br/livros/algoritmos/implementacoes-07.php재귀 void 함수를 제거

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

. 이것은 오버플로하지 않는 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]); 
}