递归函数返回的字符串是否超出范围?

时间:2015-08-04 02:30:13

标签: c++ string recursion graph

尽可能简单地给出背景上下文,我认为这对于我目前想要解决的问题是不必要的,我正在尝试通过邻接列表实现图形表示,我的情况是一个无序映射,它包含一个包含顶点对象指针(由键标识的对象)的结构值的字符串键,以及它的依赖关系的向量。目标是通过一种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;

2 个答案:

答案 0 :(得分:1)

首先,要回答您的问题,因为您按值返回字符串已复制,因此无需担心变量超出范围。

其次,更大的问题是,并非递归函数的所有路径实际上都返回一个值,这将导致未定义的行为。如果您的编译器没有就此发出警告,则应启用更多警告。

答案 1 :(得分:1)

当你递归时,你没有返回值。您正在进行递归调用,但丢弃该值并且只是从函数末尾掉下来。你需要这样做:

return recurseDeps(umcopy, lengthiestDep);