Я пытаюсь реализовать две функции на основе поиска в глубину с использованием метода рекурсии. В конечном итоге я пытаюсь сравнить время выполнения с алгоритмом warshall (который у меня уже работает). Когда я печатаю свою матрицу, она отклоняется на пару путей.
Рекурсия - это то, что может сбить меня с толку, это моя слабость. Из-за верхнего оператора if if(iIndex1 == iIndex2) return TRUE;
, когда я пытаюсь найти путь из (A,A), (B,B), (C,C) и т. д., я всегда получаю 1
, даже если пути нет от А до А.
typedef enum { FALSE, TRUE } bool;
/* Recursive function will determine if there is a path from index 1 to 2
* Based of DFS
*/
bool recPathExists( Graph G, int iIndex1, int iIndex2 )
{
int j;
G.nodeArray[iIndex1].visited = TRUE;
if(iIndex1 == iIndex2){
return TRUE;
}
for(j = 0; j < G.iNumNodes; j++){
if(!G.nodeArray[j].visited && G.adjMatrix[iIndex1][j]==1){
if(recPathExists(G, j, iIndex2))
return TRUE;
}
}
return FALSE;
}
/* Write a function to find all pairs of nodes which have paths between them.
* Store this information in the provided pathMatrix.
*/
void allPathsRecFunc( Graph G , int **pathMatrix )
{
int i, j;
for(i = 0; i < G.iNumNodes; i++){
for(j = 0; j < G.iNumNodes; j++){
if(recPathExists(G, i , j)== TRUE){
pathMatrix[i][j] = 1;
}
resetVisited(G); //resets all nodes to FALSE
}
}
}
что должно быть
A 0 1 1 1 1 1 1 1
B 0 1 0 0 1 1 1 1
C 0 1 0 0 1 1 1 1
D 0 0 0 0 0 0 0 0
E 0 0 0 0 0 0 0 0
F 0 1 0 0 1 1 1 1
G 0 1 0 0 1 1 1 1
H 0 1 0 0 1 1 1 1
что я получаю
A 1 1 1 1 1 1 1 1
B 0 1 0 0 1 1 1 1
C 0 1 1 0 1 1 1 1
D 0 0 0 1 0 0 0 0
E 0 0 0 0 1 0 0 0
F 0 1 0 0 1 1 1 1
G 0 1 0 0 1 1 1 1
H 0 1 0 0 1 1 1 1
{}
(я рекомендую всегда использовать их, даже для циклов с одним оператором), и: если рекурсия является ответом, обычно в основном императивный язык, такой как C, не является предпочтительным инструментом. . - person Marcus Müller   schedule 07.08.2017