C++20及以后递归函数常量参数的最优高效实现方案问询
C++20及以后版本中递归函数全程常量参数的高效处理方案
我想了解在C++20及以后版本中,处理递归函数里全程不变的常量参数的首选且最高效的方式。比如下面这种形式的递归函数:
void f(int p, int x) { if (someCondition(p, x)) { sideEffect; } else { f(p, g(x)); f(p, h(x)); } }
其中参数p在所有函数调用中保持不变。
这个问题早在2016年就有人提过,当时最高赞答案用了struct来封装常量参数,但有评论指出:
C++11支持闭包。所以你不再需要创建专用的struct(起个奇怪的名字)。——Frank Puffer 2016年3月21日 8:17
这说明现代C有更合适的处理方式,所以我专门询问C20甚至C++23版本里的最佳实现方案。
我是C++新手,不太理解这条评论怎么应用到递归函数上——是不是指递归lambda?递归lambda能不能获得和普通递归函数一样的编译器优化?或者有没有其他更优的策略?
我最关注性能,因为学C++就是为了高效搜索大型空间。如果信息不够,我可以补充更多细节,但希望尽量简洁。
算法详情
实际算法是改编自组合对象服务器(Combinatorial Object Server)生成k=2的林登词(Lyndon words)的算法,源自一篇论文。我希望把N和sideEffect中调用的函数作为常量参数。
算法具体形式如下:
// a是全局布尔数组,或许有更好的实现方式? // g是有副作用的函数,比如把工作项放入队列; // 它的开销可能比本算法大,不确定。 // g和N是常量参数;t和p在调用中变化。 void Gen(auto g, int N, int t, int p) { if(t>N && N == p) { // 调用`g`并读取`a`,比如添加到队列中 sideEffect(g, N, t, p); } else { a[t] = a[t-p]; Gen(g, N, t+1, p); if (!(a[t-p])) { a[t] = true; Gen(g, N, t+1, t); } }; };
我继承了原算法的一些设计选择,但可以修改;比如我不太想用全局数组a,但也许这是最快的方式。
编辑:之前示例里的g(x)和h(x)其实就是x-1和x+1,正如评论指出的,这会让问题简单一些。
内容的提问来源于stack exchange,提问作者thorimur
相关产品推荐
相关产品推荐

