C语言每日一题——第八天

第八天

小明学习到了数组,同时,在最近的开发中,他发现很多递归运算存在重复计算相同数值的问题。他决定利用数组缓存运算的结果。

有一个数组\(a_{n}\),已知\(a_n = a_{n-2} - a_{n-1} + 2\),且有\(a_1 = 1\), \(a_2 = 0\)。请编写带有缓存的函数,通过递推式计算\(a_n\)的值。你不必要检查输入,但为避免结果溢出,请使用long long类型。

输入

程序通过scanf获取希望求得的项数。

输出

项数n对应的数列值。

关键

数组初始化,数组运用,静态数组,函数递归


解答

#include <stdio.h>


#define CACHE_LENGTH 64


long long calculate_a(int);


int main() {
    int n;
    printf(">>> ");
    scanf("%d", &n);

    printf("%lld\n", calculate_a(n));

    return 0;
}

long long calculate_a(int n) {
    static long long cache[CACHE_LENGTH] = {0};  // 使用静态数组作为缓存,并将其初始化为全0数组
    if (n == 1) {
        return 1;
    } else if (n == 2) {
        return 0;
    }

    if (n - 3 < CACHE_LENGTH) {  // 由于前两个值不需缓存,缓存的下标0对应n=3
        // n 在缓存范围内
        if (cache[n - 3] == 0) {
            // 还未计算过,无缓存
            cache[n - 3] = calculate_a(n - 2) - calculate_a(n - 1) + 2;
        }
        return cache[n - 3];
    } else {
        // n过大,不在缓存范围内
        return calculate_a(n - 2) - calculate_a(n - 1) + 2;
    }
}
posted @ 2022-10-05 12:05  风吹云动  阅读(135)  评论(0编辑  收藏  举报