【问题标题】:Dynamic Programming Fibonacci Number动态规划斐波那契数
【发布时间】: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


【解决方案1】:
  1. 您正在为每次调用复制向量,因此您不要用数字填充初始向量。
  2. 您必须使用unsigned long long 来计算更多的数字(实际上是93 个)。 int 只能容纳 46 个 (1836311903)。
  3. 我会在函数内部检查向量大小,而不是在外部创建它。

使用

unsigned long long fib(int n, vector <unsigned long long> &v) {

完整代码:https://ideone.com/3Ipjgo

#include <iostream>
#include <vector>

using namespace std;

unsigned long long fib(int n, vector <unsigned long long> &v)
{
  if (v.size() <= n)
    v.resize(n + 1);

  if (v[n])
    return v[n];

  return v[n] = n <= 2 ? 1 : fib(n - 1, v) + fib(n - 2, v);
}

int main()
{
  vector <unsigned long long> v;

  cout << fib(12, v) << endl;

  for (int q=1; q<=94; ++q)
    cout << q << ' ' << fib(q, v) << endl;
    
  return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 1970-01-01
    • 2012-09-06
    • 2016-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多