改进三递归函数

时间:2019-01-08 21:48:20

标签: c++

我必须使用三重递归函数优化代码。我知道这类功能可能真的很慢,特别是在处理大量数字时。我试图通过将以下代码与斐波那契的有效代码进行比较来改进以下代码,但是我仍然很困惑。

能给我一些提示吗?如何使用循环呢?预先感谢!

int f(int i) {
    if (i == 0) return -3;
    if (i == 1) return -1;
    if (i == 2) return  4;
    if (i == 3) return  8;
    if (i == 4) return 15;
    return f(i-5) + f(i-3) + f(i-1);
}

int main() {
    int n;
    while (cin >> n) {
    for (int i = 0; i < n; ++i) cout << f(i) << " ";
    cout << "..." << endl;
    }
}

1 个答案:

答案 0 :(得分:2)

首先,您可以将结果存储在std::vector中:

int f(int n) {
    std::vector<int> res{-3, -1, 4, 8, 15};

    if (n < 5) return res[n];
    for (int i = 5; i != n + 1; ++i) {
        res.push_back(res[i - 5] + res[i - 3] + res[i - 1]);
    }
    return res[n];
}

然后为减少内存占用,您可以仅使用数组的最后一个值:

int f(int n) {
    int res[5] = {-3, -1, 4, 8, 15};

    if (n < 5) return res[n];
    for (int i = 5; i != n + 1; ++i) {
        const int fi = res[0] + res[2] + res[4];
        std::copy(res + 1, res + 5, res);
        res[4] = fi;
    }
    return res[4];
}

您甚至可以避免使用循环缓冲区进行复制并使用模。

int f(int n) {
    int res[5] = {-3, -1, 4, 8, 15};

    if (n < 5) return res[n];
    for (int i = 5; i != n + 1; ++i) {
        const int fi = res[(i - 5) % 5] + res[(i - 3) % 5] + res[(i - 1) % 5];
        res[i % 5] = fi;
    }
    return res[n % 5];
}

您可能会注意到((i - 5) % 5) == (i % 5) 并替换为

res[i % 5] += res[(i - 3) % 5] + res[(i - 1) % 5];