【发布时间】:2021-04-05 17:33:12
【问题描述】:
我是 C++ 的新手,试图拿起绳索,我试图编写一个递归和记忆的斐波那契函数,它返回第 n 个斐波那契数,我想使用 std::map 进行记忆,我还写了一个做同样事情的python版本。问题是在数字 94 处,程序的 c++ 版本返回了错误的值,但在那之前它运行良好,有人能指出我正确的方向吗?
#include <iostream>
#include <map>
#define Log(x) std::cout << x << std::endl;
unsigned long long int fib(const int &n)
{
static std::map<int, unsigned long long int> memo;
if (n < 3)
return 1;
if (memo.count(n) > 0)
return memo[n];
memo[n] = fib(n - 1) + fib(n - 2);
return memo[n];
}
int main(int argc, const char *argv[])
{
int number;
std::cout << "Enter a number: ";
std::cin >> number;
Log(fib(number));
}
这是运行良好的python版本,
import sys
def fib(n, memo={}):
if n < 3:
return 1
if n in memo:
return memo[n]
memo[n] = fib(n - 1) + fib(n - 2)
return memo[n]
sys.setrecursionlimit(10**7)
number = int(input("Enter a number: "))
print(fib(number))
这是输出:
$ ./executables/fib
Enter a number: 93
12200160415121876738
$ python ./fib.py
Enter a number: 93
12200160415121876738
$ ./executables/fib
Enter a number: 94
1293530146158671551
$ python ./fib.py
Enter a number: 94
19740274219868223167
任何帮助将不胜感激
【问题讨论】:
-
这个数字太大,无法放入
unsigned long long。 stackoverflow.com/questions/34842637/… -
我明白了,它不适合 64 位,谢谢你的帮助!。
-
我是 C++ 的新手,试图拿起绳索, -- 不要使用 Python 作为编写 C++ 代码的模型。你最终只会对一个有缺陷、效率低下或对 C++ 程序员来说看起来很奇怪的程序感到更加困惑。
-
欢迎使用 C++!需要注意的一件事是尽量远离
#define。在这种情况下,您应该编写一个日志函数,而不是依赖该宏。如果您希望它接受通用的 whatever 参数,您可以使用模板,因为这是一个完美的测试示例。 -
另一件值得注意的事情是
unsigned long long int是uint64_t的一种笨拙方式,如<cstdint>中所定义。短类型名称清楚地表明它是一个 64 位无符号,而前者则更加模棱两可。
标签: c++ recursion memoization