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/

相关文章:

language-agnostic - 常见的伪代码问题、谜题和挑战

c++ - 如何解决这个循环包含?

c++ - 如何使用模板作为参数调用函数

java - 无法理解递归函数的输出。

java - 如何递归地用0和1填充矩阵?

java - 查找未排序数组中第 k 个最小的元素

algorithm - 什么是节点图中随机路径的快速稳定算法?

c++ - 实例化点可以延迟到翻译单元结束吗?

c++ - 如何用 C++ 编写通用排序函数?

由于递归方法调用而导致Java堆栈溢出