C++递归调用时map存储的记忆化值丢失问题求助
问题根因
- 函数
SumNum的memo参数使用值传递,每次递归调用时都会创建独立的map副本,子递归中对副本的修改不会同步到上层调用的map对象中。你在递归内层添加的元素仅存在于内层的副本里,递归返回到上层后上层的map并没有新增内容,就会出现元素被清空的错觉。
修复方法
将memo参数改为引用传递,让所有递归调用共享同一个map对象即可,修改步骤如下:
- 修改
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; }
- 在
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
相关产品推荐
相关产品推荐

