【发布时间】:2019-04-25 13:58:53
【问题描述】:
我已经使用带有记忆的递归解决方案完全解决了 HackerRank (https://www.hackerrank.com/challenges/ctci-recursive-staircase/problem) 上的一个特定问题:
std::map<int, int> memoize;
int davis_staircase(int n) {
if (n == 0) {
return 1;
} else if (n < 0) {
return 0;
}
auto find = memoize.find(n);
if (find != memoize.end()) {
return find->second;
}
int num_steps = davis_staircase(n - 1) + davis_staircase(n - 2) + davis_staircase(n - 3);
memoize[n] = num_steps;
return num_steps;
}
我想隐藏我用作查找的全局std::map(不使用类),并认为我会尝试创建一个可以递归调用的 lambda,并通过引用捕获缓存/映射.我尝试了以下方法:
int davis_staircase_2(int n) {
std::map<int, int> memo;
//auto recurse = [&memo](int n) -> int { // attempt (1)
//std::function<int(int)> recurse = [&memo](int n) -> int { // attempt (2)
std::function<int(std::map<int, int>&, int)> recurse = [](std::map<int, int>& memo, int n) -> int { // attempt (3)
if (n == 0) {
return 1;
} else if (n < 0) {
return 0;
}
auto find = memo.find(n);
if (find != memo.end()) {
return find->second;
}
//int num_steps = recurse(n - 1) + recurse(n - 2) + recurse(n - 3); // attempt (1) or (2)
int num_steps = recurse(memo, n - 1) + recurse(memo, n - 2) + recurse(memo, n - 3); // attempt (3)
memo[n] = num_steps;
return num_steps;
};
//return recurse(n); // attempt (1) or (2)
return recurse(memo, n); // attempt (3)
}
我在上面交错了 3 次略有不同的尝试,但我无法编译。我想做的事,可能吗?
我在 MacOS 上使用 clang:
Apple LLVM version 10.0.0 (clang-1000.10.44.4)
Target: x86_64-apple-darwin18.2.0
Thread model: posix
【问题讨论】:
-
std::function<int(std::map<int, int>&, int)> recurse = [](std::map<int, int>& memo, int n) -> int {->auto recurse = [&memo, &recurse](std::map<int, int>& memo, int n) -> int {. -
This post 会有所帮助。
-
离题:这可以通过将问题表示为矩阵并通过平方使用取幂来解决,无需递归。这样您就可以将问题从
o(n)复杂度更改为o(log(n))复杂度。另一方面,由于n的约束是如此之小<36这将是一个矫枉过正。
标签: c++ c++11 recursion lambda