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

C++递归调用时map存储的记忆化值丢失问题求助

问题根因
  • 函数SumNum的memo参数使用值传递,每次递归调用时都会创建独立的map副本,子递归中对副本的修改不会同步到上层调用的map对象中。你在递归内层添加的元素仅存在于内层的副本里,递归返回到上层后上层的map并没有新增内容,就会出现元素被清空的错觉。
修复方法

将memo参数改为引用传递,让所有递归调用共享同一个map对象即可,修改步骤如下:

  1. 修改SumNum函数的参数定义,给memo添加引用符号&:
static int SumNum(string target, string m[], map<string, int>& memo){
    // 函数内部逻辑保持不变
    if (memo.find(target) != memo.end()) {
        cout << memo.find(target)->second<<"\n";
        return memo.find(target)->second;
    }
    if (target == "") return 1;

    int totalCount = 0;
    
    for(auto i = 0;i < 10; i++)
    {   
        if (target.find(m[i]) == 0){
            int numOfWays = SumNum(target.substr(m[i].length()),m,memo);
            totalCount += numOfWays;
        }
    }
    memo.emplace(target, totalCount);
    return totalCount;
}
  1. 在main函数中手动创建空map对象传入,避免引用绑定临时对象的问题:
int main(){
    string ar[10] = {"e","ee","eee","eeee","eeeee","eeeeee","f","fdc","d","c"};
    string target = "eeeeeeeeefdc";
    map<string, int> memo;
    auto answer = SumNum(target,ar,memo);
    cout << answer;
}

修改完成后所有递归调用都会操作同一个map对象,插入的键值对会全局生效,不会再出现元素丢失的问题。

内容的提问来源于stack exchange,提问作者skamer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 12:36:02