尽可能简单地给出背景上下文,我认为这对于我目前想要解决的问题是不必要的,我正在尝试通过邻接列表实现图形表示,我的情况是一个无序映射,它包含一个包含顶点对象指针(由键标识的对象)的结构值的字符串键,以及它的依赖关系的向量。目标是通过一种DAG分辨率算法输出关键路径。
因此,当我需要输出关键路径时,我正在尝试使用我实现的递归解决方案。基本上它查找基本情况(如果作业没有依赖关系),返回其id,开始时间和长度的打印。否则,在其依赖项列表中找到运行时间最长(就时间长度而言)的作业,并在其上调用该函数,直到找到没有依赖项的作业。可以有多个关键路径,我不必打印出所有这些路径。
我的问题:我现在正在调试这个问题,在基本情况下打印出作业的属性没有问题。如果必须递归,则字符串总是返回为空(“”)。递归调用是否使我的字符串在返回调用者时超出范围?这是它的代码结构。以下所有函数都是同一Graph类的公共成员。
string recurseDeps(unordered_map<string, Dependencies>& umcopy, string key) {
if (umcopy[key].deps.empty()) {
string depPath = " ";
string idarg, starg, larg, deparg;
idarg = key;
starg = " " + to_string(umcopy[key].jobatKey->getStart());
larg = " " + to_string(umcopy[key].jobatKey->getStart() + umcopy[key].jobatKey->getLength());
umcopy.erase(key);
return depPath + idarg + starg + larg;
}
else {
string lengthiestDep = umcopy[key].deps[0];
for (auto i = begin(umcopy[key].deps); i != end(umcopy[key].deps); i++) {
if (umcopy[*i].jobatKey->getLength() >
umcopy[lengthiestDep].jobatKey->getLength()) {
lengthiestDep = *i;
}
}
recurseDeps(umcopy, lengthiestDep);
}
}
string criticalPath(unordered_map<string, Dependencies>& um, vector<Vertex*> aj) {
unordered_map<string, Dependencies> alCopy = um;
string path = aj[0]->getId();
for (auto i = begin(aj); i != end(aj); i++) {
if (um[(*i)->getId()].jobatKey->getLength() >
um[path].jobatKey->getLength()) {
path = (*i)->getId();
}
}
return recurseDeps(alCopy, path);
}
稍后在类成员中,一个名为readStream()的函数调用如下函数:
cout << time << criticalPath(adjList, activeJobs) << endl;
答案 0 :(得分:1)
首先,要回答您的问题,因为您按值返回字符串已复制,因此无需担心变量超出范围。
其次,更大的问题是,并非递归函数的所有路径实际上都返回一个值,这将导致未定义的行为。如果您的编译器没有就此发出警告,则应启用更多警告。
答案 1 :(得分:1)
当你递归时,你没有返回值。您正在进行递归调用,但丢弃该值并且只是从函数末尾掉下来。你需要这样做:
return recurseDeps(umcopy, lengthiestDep);