【发布时间】:2019-04-04 19:36:06
【问题描述】:
我有一个递归问题想用递归来解决。
例如,给定这个邻接矩阵 AdjMat:
0 1 2 3
0 0 1 0 0
1 1 0 1 0
2 0 1 0 1
3 0 0 1 0
假设我想查看第 0 列及其所有邻居,以及其邻居的邻居(距离为 2),并将所有行索引 > 0 存储到一个整数链表中。
这是我更新的代码:
intNode *Neighbors(intNode *head, int colOfInterest, int distance) {
int x = colOfInterest;
if (distance == 0) {
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
if (AdjMat[x][j] > 0) {
head = insertInt(head, j);
}
}
break;
}
}
intNode *subpath = NULL;
for (int i = 0; i < distance; i++) {
subpath = Neighbors(head, colOfInterest, distance);
}
// Once the final neighbor column has been reached, add elements to the linked list.
return head;
}
它目前没有返回预期的输出(即链表中的 0、1 和 2),但我不知道为什么。任何帮助或指导表示赞赏。
【问题讨论】:
-
嗯。当您递归调用
nearestNeighbors时,您可能希望保存返回值,即新的列表头。你应该下定决心是否要使用递归或循环迭代。您的代码似乎是两者的混合体。 -
你能用伪代码解释一下这个循环应该做什么吗?目前您多次访问单元格,我认为您需要明确的规则来停止递归。但我根本不明白它应该做什么。
-
使用与当前化身相同的值调用递归。
-
如果必须使用递归解决问题,那么我怀疑您已经倒退了。您似乎没有设计解决方案的递归公式然后实施它,而是设计了一个解决方案,然后尝试将一些递归插入其中。
-
正如我所说,在尝试实现它之前,递归地制定问题。例如,假设您要计算从起始节点通过长度为 d 的路径可到达的节点集合 N(d)。好吧,我们可以递归地定义它,因为所有节点都与 N(d - 1) 中的任何节点相邻。如果我们然后让 N(0) 是包含(仅)起始节点的集合,那么我们就有了一个完整的解决方案基础。
标签: c recursion adjacency-matrix