开篇
本文的目的是使用C语言模拟k阶常系数线性递归的运算过程,题目来源为《编程珠玑》第3章【数据决定程序结构】的课后习题2。具体的题目概要和代码实现,请看下文。
问题概要
因为这种问题涉及到的数学公式不太方便打出来,我直接用我笔记的原图了哈。
思路分析
还是上面同样的理由,我直接给出我笔记截图。
代码实现
#include <stdio.h>
#include <stdlib.h>
int main() {
int k, m;
printf("请输入递归关系的阶数k: ");
scanf_s("%d", &k);
double* a = (double*)malloc(k * sizeof(double)); // 存储k个数值
double* c = (double*)malloc((k + 1) * sizeof(double));// 存储k+1个系数
if (a == NULL || c == NULL) {
printf("内存分布失败!\n");
return 1;
}
printf("请输入序列的前%d个项: ", k);
for (int i = 0; i < k; i++) {
scanf_s("%lf", &a[i]);
}
printf("请输入%d个系数: ", k + 1);
for (int i = 0; i <= k; i++) {
scanf_s("%lf", &c[i]);
}
printf("请输入要计算的项数: ");
scanf_s("%d", &m);
// 此处的目的是先把前k个项打印出来
printf("序列直到第%d项为: \n", m);
for (int i = 0; i < k; i++) {
printf("%f ", a[i]);
}
for (int n = k; n < m; n++) {
double nextTerm = c[k];// 从k+1的常数项开始计算
for (int j = 0; j < k; j++) {
nextTerm += c[j] * a[k - 1 - j];// 反向应用c1到ck
}
printf("%f ", nextTerm);
// 正确存储最近的k个数值
for (int j = 0; j < k - 1; j++) {
a[j] = a[j + 1];
}
a[k - 1] = nextTerm;
}
printf("\n");
free(a);
free(c);
return 0;
}
注
以上,就是对于k阶常系数线性递归的全部代码逻辑了,希望对您有所帮助。
因个人能力有限,若代码有需要优化和错误的地方,还请指正。
感谢阅读。