如何解决C++ 在 Memoization 期间通过引用传递 std::map 并将其保存在 Stack
如何在 Memoization 过程中通过引用传递地图?
*通过指针传递地图工作正常,但我需要将它保留在堆栈上,不知道如何实现这一点。
第一种方法 fib 工作正常,但函数 fibRef 不工作,地图不接受该对。
我可以理解它与 RValue 和 LValue 相关。
*
//
// Fib.cpp
//
//
// Created by Youssef Hanna on 1/26/21.
//
#include <stdio.h>
#include <iostream>
#include <map>
// works fine
long long fib(int n,std::map<int,long long> *values = new std::map<int,long long>())
{
if (n <= 2 )
return n;
if(values->find(n) != values->end())
return values->at(n);
long long result = fib(n-1,values) + fib(n-2,values);
values->insert(std::pair<int,long long>(n,result));
return result;
}
// Error values not added to the map
int fibRef(int n,int> values = {})
{
if (n <= 2)
return 1;
if(values.find(n) != values.end())
return values.at(n);
int result = fibRef(n-1,values) + fibRef(n-2,values);
values.insert(std::pair<int,int>(n,result));
return result;
}
// Best option at the moment
long long fibWithPassingMap(int n,long long> & values)
{
if (n <= 2)
return 1;
if(values.find(n) != values.end())
return values.at(n);
long long result = fibWithPassingMap(n-1,values) + fibWithPassingMap(n-2,result));
return result;
}
void runFibTest(){
std::cout<<"\n"<<fib(10) << "\n" ;
std::cout<<"\n"<<fib(20) << "\n" ;
std::cout<<"\n"<<fib(30) << "\n" ;
std::cout<<"\n"<<fib(100) << "\n" ;
std::cout<<"\n"<<fib(250) << "\n" ;
std::cout<<"\n"<<fib(1000) << "\n" ;
std::map<int,long long> map;
std::cout<<"\n"<<fibWithPassingMap(100,map) << "\n" ;
std::cout<<"\n"<<fibWithPassingMap(90,map) << "\n" ;
std::cout<<"\n"<<fibWithPassingMap(25,map) << "\n" ;
std::cout<<"\n"<<fibWithPassingMap(30,map) << "\n" ;
std::cout<<"\n"<<fibWithPassingMap(1020,map) << "\n" ;
map.clear();
std::cout<<"\n"<<fibRef(100) << "\n" ; // too long because memoization not working
}
提前致谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。