c++ - 具有常量参数的递归函数

标签 c++ recursion pseudocode

在 C++ 中,是否有一种首选方法来处理每次都重用未更改对象的递归函数?例如(伪代码):

void func(HashMap h, Logger logger, int depth)
{
    // Do stuff then call func recursively...
    func(h, logger, depth+1);
}

所以每次调用我们都传入几个对象( HashMap 和记录器)不变。是的,我们可以通过引用传递,但它看起来仍然效率低下并且看起来不太漂亮。我能想到的唯一选择是全局变量或将常量参数捆绑在一个结构中。

最佳答案

您所描述的是一个封闭的词法环境,也称为“闭包”。这个概念“免费”存在于 Lisp 和 Scheme 等动态语言中,其中“let over lambda”模式允许您在函数中捕获变量并使用它们,即使它们的封闭范围已经消失或退出也是如此。

您可以在 C++ 中模拟闭包,使用 struct 作为捕获变量的容器并将函数(仿函数)应用于 struct。最常见的模式通常是 operator() 的使用方式:

struct my_closure {
   Hashmap &hmap_;
   Logger &logger_;
   int depth_;

   my_closure(Hashmap &hmap, Logger &logger, int depth) :
     hmap_(hmap), logger_(logger), depth_(depth)
   { }

   void operator()(void)
   { /* do stuff here, including recurse */ }
};

唯一能为您节省的是将额外的东西压入堆栈,这不一定能为您节省很多周期(1 struct reference [this pointer for the struct] vs. 2 个引用 + 1 个整数。)如果您的编译器支持尾递归,这可能会以牺牲可读性为代价。

关于c++ - 具有常量参数的递归函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36119148/

相关文章:

c - 交替递增序列

java - 递归问题

python - 从文件标题中提取不同长度数字的算法

c++ - 使用 boost::thread 的并行任务比使用 ppl 或 OpenMP 获得更好的性能

c++ - 字符数组和字数统计

c++ - 有没有办法让 QXmlStreamReader 处理格式错误的 XML?

算法 - TOC 的编号(目录)

c++ - 将所有权从 unique_ptr<T,void(*)(T*)> 转移到 unique_ptr<const T,void(*)(const T*)>

MySQL 查询或存储过程递归调用自身并返回所选父节点的所有节点

python - Python 3 中的模幂实现