如何在C ++中完成corecursion?

逻辑谬误

我正在从事一个C ++项目,该项目需要与树结构频繁交互,这意味着许多递归函数,并且我正在寻找改进代码的方法。几天我遇到了corecursion,对我的应用程序探索这种策略很感兴趣。

但是,我还找不到如何使用C ++完成corecursion的任何示例。为了明确我的问题,如何在C ++中使用corecursion进行此树遍历

def bf(tree):
    tree_list = [tree]
    while tree_list:
        new_tree_list = []
        for tree in tree_list:
            if tree is not None:
                yield tree.value
                new_tree_list.append(tree.left)
                new_tree_list.append(tree.right)
        tree_list = new_tree_list

如果这样做不是一个好主意,请告诉我。也就是说,在Internet上对此一些答案将对将来尝试这样做的人很有用。SO匹配没有问题,[c++] corecursion互联网的其余部分似乎缺乏有关该主题的有用信息。

pepper_chico

以下内容与给定的python实现几乎相同,您现在可以在生产中使用它:

Live On Coliru

#include <vector>
#include <iostream>
#include <boost/coroutine/all.hpp>

using namespace std;

struct Node {
    char value;
    Node *left;
    Node *right;
};

using generator =
    boost::coroutines::asymmetric_coroutine<decltype(Node::value)>::pull_type;

generator bf(Node *tree) {                                //def bf(tree):
    return generator([=](auto &yield) {                   //
        vector<Node *> tree_list = {tree};                //    tree_list = [tree]
        while (!tree_list.empty()) {                      //    while tree_list:
            vector<Node *> new_tree_list;                 //        new_tree_list = []
            for (auto tree : tree_list) {                 //        for tree in tree_list:
                if (tree != nullptr) {                    //            if tree is not None:
                    yield(tree->value);                   //                yield tree.value
                    new_tree_list.push_back(tree->left);  //                new_tree_list.append(tree.left)
                    new_tree_list.push_back(tree->right); //                new_tree_list.append(tree.right)
                }                                         //
            }                                             //
            tree_list = move(new_tree_list);              //        tree_list = new_tree_list
        }                                                 //
    });                                                   //
}                                                         //

int main() {
    Node a{'a'}, b{'b'}, c{'c'}, d{'d'}, e{'e'};

    a.left = &b;
    a.right = &c;
    b.right = &d;
    d.left = &e;

    for (auto node_value : bf(&a))
        std::cout << node_value << " ";
}

为了避免分配/取消分配,我可能会这样做:

generator bf(Node *tree) {
    return generator([=](auto &yield) {
        vector<Node *> tree_list = {tree}, new_tree_list;
        while (!tree_list.empty()) {
            for (auto tree : tree_list) {
                if (tree != nullptr) {
                    yield(tree->value);
                    new_tree_list.push_back(tree->left);
                    new_tree_list.push_back(tree->right);
                }
            }
            swap(tree_list, new_tree_list);
            new_tree_list.clear();
        }
    });
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何在严格评估的设置中编码corecursion / codata?

来自分类Dev

如何在Excel中完成

来自分类Dev

如何在Anjuta中逐步完成C程序?

来自分类Dev

您如何在C9 IDE中自动完成?

来自分类Dev

如何在C ++中实现OOBE完成通知?

来自分类Dev

如何在Visual Studio中完成C ++类等

来自分类Dev

如何在C中完成自动数组的排序?

来自分类Dev

如何在ionic 2中完成自动完成(搜索栏)

来自分类Dev

如何在Coq中完成此证明

来自分类Dev

如何在JGit中完成合并基础?

来自分类Dev

如何在RxJS中完成Observable

来自分类Dev

如何在emacs中获得代码完成?

来自分类Dev

如何在OmniThreadLibrary中处理IOmniParallelJoin完成?

来自分类Dev

如何在自动完成中显示链接

来自分类Dev

如何在终端中“完成”命令?

来自分类Dev

如何在bash函数中完成路径

来自分类Dev

如何在Java中完成频率表

来自分类Dev

如何在spyder中自动完成括号

来自分类Dev

如何在With Query中完成Multiple Join?

来自分类Dev

如何在C ++中“ sscanf”?

来自分类Dev

如何在C中截断

来自分类Dev

如何在 C 中解析

来自分类Dev

如何在objective-c中的完成块上传递参数

来自分类Dev

如何在Obj C中编写没有完成块的异步方法的单元测试

来自分类Dev

Ctrl + C时如何在shell脚本中杀死并等待后台进程完成?

来自分类Dev

如何在线程中的当前作业完成时中止线程C#

来自分类Dev

如何在objective-c中的完成块上传递参数

来自分类Dev

如何在VSTO C#的excel单元中的Excel单元格中制作自动完成文本框

来自分类Dev

如何在LibreOffice Calc中自动完成公式