递归return,循环调用的问题

赤练仙子_ 2016-06-19 05:35:51
[编程题]有向路径检查
对于一个有向图,请实现一个算法,找出两点之间是否存在一条路径。
给定图中的两个结点的指针UndirectedGraphNode* a,UndirectedGraphNode* b(请不要在意数据类型,图是有向图),请返回一个bool,代表两点之间是否存在一条路径(a到b或b到a)。


我用的是深度搜索,for循环里return checkPath(a->neighbors[i], b);这句如果checkPath(a->neighbors[i], b)这个函数的返回值是false,return false是不是就跳出for循环,那调用这个函数的父函数里其他邻节点就不遍历了?代码错了?可测试用例都通过了啊。。。求解
/*
struct UndirectedGraphNode {
int label;
vector<struct UndirectedGraphNode *> neighbors;
UndirectedGraphNode(int x) : label(x) {}
};*/

class Path {
public:
bool checkPath(UndirectedGraphNode* a, UndirectedGraphNode* b) {
return check(a, b) || check(b, a);
}
bool check(UndirectedGraphNode* a, UndirectedGraphNode* b) {
if (a == NULL || b == NULL)
return false;
if (a == b)
return true;
map<UndirectedGraphNode*, bool> visited;
visited[a] = true;
for (int i = 0; i < a->neighbors.size(); i++)
{
if (a->neighbors[i] == b)
return true;
else
if (visited[a->neighbors[i]] == false)
return checkPath(a->neighbors[i], b);
}
return false;
}
};
...全文
407 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
化身天 2018-08-27
  • 打赏
  • 举报
回复
逻辑错误,for循环里return递归只会调用一次
lm_whales 2016-06-20
  • 打赏
  • 举报
回复
逻辑是对的就没问题了,剩下的就是效率等问题了 还有就是 测试用例
赤练仙子_ 2016-06-20
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
if (a->neighbors[i] == b) return true; else if (visited[a->neighbors[i]] == false) return checkPath(a->neighbors[i], b); //else continue;??? 这里有三条路径 return 啥都没关系,第三条路径还是可以执行的,问题在于逻辑对不对 以及,有没有递归, 如果有递归,是否会递归太深,栈满崩溃
逻辑是对的,深度搜索,就是找一个点看是不是b,如果不是再找它的邻接点是不是b,for循环是要找它所有邻接点,如果不是邻接点再找邻接点,直到所有点都找过
赤练仙子_ 2016-06-20
  • 打赏
  • 举报
回复
引用 2 楼 lm_whales 的回复:
if (a->neighbors[i] == b) return true; else if (visited[a->neighbors[i]] == false) return checkPath(a->neighbors[i], b); //else continue;??? 这里有三条路径 return 啥都没关系,第三条路径还是可以执行的,问题在于逻辑对不对 以及,有没有递归, 如果有递归,是否会递归太深,栈满崩溃
我的意思是,for (int i = 0; i < a->neighbors.size(); i++) { if (a->neighbors[i] == b) return true; else if (visited[a->neighbors[i]] == false) return checkPath(a->neighbors[i], b); } 如果找到路径return true当然退出循环,如果没有找到路径return checkPath(a->neighbors[i], b);返回的是false,那for循环还要继续执行,因为a的别的邻接点可能是b,但是return好像就直接退出for循环了对吗?那
lm_whales 2016-06-19
  • 打赏
  • 举报
回复
这个可以自己写测试用例吧? 你可以用数量比较少的点(5个。10个?), 做一批 任何情况都考虑到的全部测试用例
lm_whales 2016-06-19
  • 打赏
  • 举报
回复
if (a->neighbors[i] == b) return true; else if (visited[a->neighbors[i]] == false) return checkPath(a->neighbors[i], b); //else continue;??? 这里有三条路径 return 啥都没关系,第三条路径还是可以执行的,问题在于逻辑对不对 以及,有没有递归, 如果有递归,是否会递归太深,栈满崩溃
小灸舞 2016-06-19
  • 打赏
  • 举报
回复
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出

65,186

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧