对列表执行递归C++

Performing recursion on a list C++

本文关键字:C++ 递归 执行 列表      更新时间:2023-10-16

我正在尝试使用 std list 确定可以从列表中删除的最大项目数以获得最小大小。但是,它一直以错误的内存访问告终。

这是我的递归函数:

int step (list<int> mylist) {
    int count = mylist.size();
    // Terminations
    if (!checkRemaining(mylist)) {
        return mylist.size();
    }
    if (mylist.empty()) {
        return 0;
    }
    //printf("mysize: %dn", mylist.size());
    // Else we do not terminate first
    for (auto i=mylist.begin(); i != prev(mylist.end()); ++i)
    {
        if ((*i + *next(i))%2 == 0) // Problem starts from here, bad access
        {
            mylist.erase(next(i));
            mylist.erase(i);
            printf("this size %lun", mylist.size());
            list<int> tempList = mylist;
            for (auto it = tempList.begin(); it != tempList.end(); it++) {
                printf("%d ", *it);
            }
            printf("n");
            int temp = step (tempList);
            if (temp < count) count = temp;
        }
    }
    return count;
}

它设法降低到所需的大小,但由于内存访问错误,程序会崩溃。

一旦你执行mylist.erase(i);i就失效了,所以你在循环中的++i是UB。

您的代码应如下所示:

for (auto i = mylist.begin(); i != mylist.end() && i != prev(mylist.end()); /* Empty */)
{
    if ((*i + *next(i)) % 2 == 0)
    {
        mylist.erase(next(i));
        i = mylist.erase(i);
        // maybe you want prev(i) if i != mylist.begin()
#ifdef DEBUG
        std::cout << "this size " << mylist.size() << "n";
        for (const auto& e : myList) {
            std::cout << e << " ";
        }
        std::cout << "n";
#endif
        count = std::min(count, step(myList));
    } else {
        ++i;
    }
}
此外,当您

删除最后一个元素时,最终检查应正确处理。