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;
}
}