You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 17:27:50