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++ - 函数指针及其调用参数

c++ - Visual Studio 2010,C++,无法打开包含文件 : 'base.h'

C++ Boost递归变体重载apply_visitor

algorithm - 多项式乘法的 Small-o(n^2) 实现

algorithm - 该伪代码的大 O 是什么?

c++ - 如何防止 Valgrind 为每个新线程启动嵌入式 gdbservers?

c++ - 使用较新的 SIMD 版本时是否可以使用较旧的 SIMD 版本?

c - 递归函数,调用后调用

c++ - 在 C++ 中用递归替换 N 级 for 循环

arrays - 在数组数组(或列表列表等)中查找指定元素的深度