【发布时间】:2021-03-16 00:40:49
【问题描述】:
我正在尝试使用记忆法来计算第 n 个斐波那契数。
#include <iostream>
#include <vector>
using namespace std;
int fib(int n, vector<int> v) {
int result = 0;
if (v[n] != 0) {
return v[n];
}
if (n == 1 || n == 2) {
result = 1;
}
else {
result = fib(n - 1, v) + fib(n - 2, v);
}
v[n] = result;
return result;
}
int main()
{
int n = 12;
vector<int> v(n + 1, 0);
cout << fib(n, v);
}
但是,我得到了这个错误。
运行时错误:将无符号偏移量添加到 0x602000000110 溢出到 0x60200000010c (stl_vector.h) 摘要:UndefinedBehaviorSanitizer:未定义行为 /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h :1043:34
如何更改解决方案来解决此问题?谢谢!
【问题讨论】:
-
您应该将 n 与向量的大小进行比较。
-
您还希望通过引用传递向量,以便实际保留您的备忘录,而不是作用于备忘录向量
v的副本。 -
可能会切换到双精度而不是整数,因为你也有整数溢出
-
更新了我的答案。
-
@MarouaneFazouane,int32 可以容纳前 46 个数字。
标签: c++ recursion dynamic-programming fibonacci