c++ - 对列表 C++ 执行递归

标签 c++ recursion linked-list

<分区>

我正在尝试使用 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: %d\n", 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 %lu\n", 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;
    }
}

此外,当您删除最后一个元素时,最终检查应该正确处理。

关于c++ - 对列表 C++ 执行递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48563594/

相关文章:

c++ - 为什么模板模板参数不允许 'typename'在参数列表之后

c++ - 具有多个字符分隔符的正则表达式

c++ - 一个递归函数,用于打印整数的素因子分解元素

php - 在多维树状数组中查找键的路径

c - 如何移动链表的数据? (在C中)

c++ - 内部带有结构的类未实例化(立即出现段错误)

c++ - 我可以一直使用 1 位 boolean 值吗?

c++ - 共享指针声明

java - 在数组中添加连续的整数对的分而治之算法有问题

c - C中的链表实现(只打印最后两个节点)