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

  • 相关阅读:
    简述-计算机语言的前世今生
    记一次由于引用第三方服务导致的GC overhead limit exceeded异常
    JAVA初始化及类的加载
    springboot容器启动顺序之@Configuration ContextRefreshedEvent事件初始化 ApplicationRunner
    高并发编程之发布与溢出
    编写高质量JAVA代码之让接口的职责保持单一
    Spring Boot中初始化资源的几种方式
    Thread.yeild方法详解
    JAVA基础之this关键之理解
    Django 1.10 中文文档------3.3.8 会话sessions
  • 原文地址:https://www.cnblogs.com/scut-fm/p/3654425.html
Copyright © 2020-2023  润新知