问题分析
输入:阶数 k,级数前 k 项 a1 - ak,常系数 c1 - ck+1,要求到的级数项 m
输出:1 - m 项级数 a1 -am
约束:无
思路分析
首先要明白 m 肯定是大于 k 的,不然这题不用解答。
然后要理清这里面存在的递归关系,可以假设 k = 3,c1 - c4 为 1-4,那么就有如下的递归式:
an = an-1 + 2an-2 + 3an-3 +4
因此,可以使用递归法求出第 k+1 至 第 m 项级数,但要注意的是管理好动态数组以存取求解阶段需要用到的各个数据,这也是本题考察的重点。
代码实现
说明:不使用数组的方法会很复杂,暂不实现这种方法。
1 #include <iostream> 2 3 using namespace std; 4 5 // 计算级数函数 6 int countA( int *a, int *c, int k, int n); 7 8 int main(void) { 9 // 获取阶数,级数前 k 项,前 k+1 项系数并保存。 10 int k; 11 cout << "请输入阶数 k :" << endl; 12 cin >> k; 13 14 int *a = new int[k]; 15 int *c = new int[k+1]; 16 17 cout << "请输入前 " << k << " 项级数:" << endl; 18 for (int i=0; i<k; i++) 19 cin >> a[i]; 20 cout << "请输入前 " << k+1 << " 项系数:" << endl; 21 for (int i=0; i<k+1; i++) 22 cin >> c[i]; 23 24 int m; 25 cout << "请输入要求到的级数项数:" << endl; 26 cin >> m; 27 28 // 打印求解结果 29 int an; 30 cout << endl << "1 - " << m << " 项级数求解如下:" << endl; 31 for (int i=1; i<=m; i++) { 32 an = countA(a, c, k, i); 33 cout << "a" << i << " :" << an << endl; 34 } 35 36 return 0; 37 } 38 39 int countA( int *a, int *c, int k, int n) { 40 // 递归终点 41 if (n <= k) 42 return a[n-1]; 43 44 // 递归求解 45 int an = 0; 46 for (int i=0; i<k; i++) { 47 an += c[i] * countA(a, c, k, n-i-1); 48 } 49 an += c[k]; 50 51 return an; 52 }
小结
1. 本题中的阶数 k 可能很长,如果直接按照公式求解则会导致冗长的代码。本文中的代码采用动态数组存放相关数据( 可以允许用户输入任意长度的 k ),代码精简多了。
2. 比起仅计算第 15 项系数的情况,这种一般性的解法反而更简单。