首页 > 解决方案 > 无法理解如何摆脱 goto

问题描述

这个问题可能有点傻,但我真的需要帮助。

我在编程方面很新,据我所知,goto这是我应该在我的代码中避免的事情。几天前,我为我的学校任务写了这个:

bool create_way(int start_index) {
if (start_index == members.get_size() - 1) {
    flowToDrain.push_back(start_index);
    return true;
}

find_any_way:
int max_index = INT_MIN;
int max_bandwidth = INT_MIN;

for (int i = 0; i < network[start_index].routes.get_size(); i++) {

    int index = network[start_index].routes.find(i);
    int bandwidth = network[index].bandwidth.find(start_index);

    if (bandwidth > max_bandwidth && !network[index].visited) {
        max_index = index;
        max_bandwidth = bandwidth;
    }
}

network[start_index].visited = true;

if (max_index != INT_MIN) {
    if (!create_way(max_index)) goto find_any_way;
    else {
        flowToDrain.push_back(start_index);
        return true;
    }
}
else return false; }

我写信goto是为了记住算法的逻辑,但现在我真的坚持下去了。从那以后,我还没有想出如何摆脱这种情况的任何想法。我明白,它应该是一个循环,可能带有continue,但我不明白要在其中检查什么表达式。

标签: c++

解决方案


这应该可以工作,尽管您应该对其进行测试:

while(1) {
    int max_index = INT_MIN;
    int max_bandwidth = INT_MIN;

    for (int i = 0; i < network[start_index].routes.get_size(); i++) {

        int index = network[start_index].routes.find(i);
        int bandwidth = network[index].bandwidth.find(start_index);

        if (bandwidth > max_bandwidth && !network[index].visited) {
            max_index = index;
            max_bandwidth = bandwidth;
        }
    }

    network[start_index].visited = true;

    if (max_index != INT_MIN) {
        if (!create_way(max_index)) continue;
        else {
            flowToDrain.push_back(start_index);
            return true;
        }
    }
    else return false;
}

推荐阅读