为什么这段代码会打印垃圾?

时间:2016-01-13 20:49:44

标签: c++ caching recursion vector fibonacci

这是一个带缓存的简单递归方法,因此不会一遍又一遍地重新计算数字。我确实看到它有效,但现在它被打破并打印出垃圾。我已经尝试恢复工作版本,但却无法找到可能导致其破坏的任何差异。

为什么它停止工作?

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

int Fibonacci_vector(int n) {
    static vector<int> cache(2, 1);
    cache.reserve(n);
    if (cache[n] == 0) {
        cache[n] = Fibonacci_vector(n-1) + Fibonacci_vector(n-2);
    }
    return cache[n];
}

int main() {
    cout << Fibonacci_vector(4);
}

更新 Jeez,我是如此愚蠢,只是伤害。我已将if (n > cache.size()) { cache.resize(n); }更改为cache.reserve(n);当然它已经破坏了所有内容!对不起我的愚蠢,伙计们。

2 个答案:

答案 0 :(得分:5)

  1. std::vector::reserve,还有std::vector::resizeThey do different things

    cache[n]在两种情况下仍然是超出范围的访问(在std::vector::resize的情况下,最后一个元素是

  2. 计算条件不应尝试访问任何缓存数据(超出范围),只需比较if(n >= cache.size())

  3. 只有满足上述条件时才需要致电cache.resize(n + 1),所以请将其放在if - 条款中。

答案 1 :(得分:1)

您需要检查元素是否存在。像这样更改代码:

int Fibonacci_vector(int n) {
    static vector<int> cache(2, 1);
    if (n >= cache.size()) {
        cache.push_back(Fibonacci_vector(n-1) + Fibonacci_vector(n-2));
    }
    return cache[n];
}