第 3 章 第 2 题 求级数问题 递归法实现

问题分析

  输入:阶数 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 项系数的情况,这种一般性的解法反而更简单

 

 

转载于:https://www.cnblogs.com/scut-fm/p/3654425.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值