我正在学习记忆,并决定将这种技术应用于计算第n-th 斐波那契数的递归函数。我不确定是否应该通过memo左值引用或右值引用传递我的地图。
下面显示的两个片段是否有任何区别(关于性能和程序的一般行为方式)?哪一个会更受欢迎?另外,有没有办法为第一个函数提供默认参数(map& memo = map{}不起作用,因为左值引用不与右值绑定......)?
版本 #1
using map = std::unordered_map<int, unsigned long long>;
unsigned long long fib(int n, map& memo){
if(memo.find(n) != memo.cend()) return memo[n];
if(n <= 2) return 1;
memo[n] = fib(n - 1, memo) + fib(n - 2, memo);
return memo[n];
}
版本 #2
using map = std::unordered_map<int, unsigned long long>;
unsigned long long fib(int n, map&& memo = map{}){
if(memo.find(n) != memo.cend()) return memo[n];
if( n <= 2) return 1;
memo[n] = fib(n - 1, std::move(memo)) + fib(n - 2, std::move(memo));
return memo[n];
}