习题2.6 递归求简单交错幂级数的部分和 (15 分)

习题2.6 递归求简单交错幂级数的部分和 (15 分)

本题要求实现一个函数,计算下列简单交错幂级数的部分和:

f(x,n)=x−x​2​​+x​3​​−x​4​​+⋯+(−1)​n−1​​x​n​​

函数接口定义:

double fn( double x, int n );

其中题目保证传入的n是正整数,并且输入输出都在双精度范围内。函数fn应返回上述级数的部分和。建议尝试用递归实现。

裁判测试程序样例:

#include <stdio.h>

double fn( double x, int n );

int main()
{
    double x;
    int n;

    scanf("%lf %d", &x, &n);
    printf("%.2f\n", fn(x,n));

    return 0;
}

/* 你的代码将被嵌在这里 */

输入样例:

0.5 12

输出样例:

0.33

这道题是递归的一个入门级的练手题,相当的简单,还是遵循递归问题的一个基本步骤,三步走:

第一:设计好递归函数的参数和返回值,这个根据题目的需要好好考虑清楚,可以不一定一开始就写对但是一定尽可能考虑周全;

第二找到递归的出口,也就是找到递归的边界条件;

第三步寻找两项之间的关系,也就是找到如何将第N项转变为第N+1项的递推公式,如果是数组那么就很好解决,只有从n和n-1项中去寻找其关系即可;如果是函数的递归调用,这里本题目没有涉及,我结合后面的一些问题,大概可以这么去写,递归的逻辑是倒着来的,所以需要倒着来写。

### 回答1: 这道题要求实现一个函数计算下列简单交错幂级数部分和:$$ 1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+\frac{1}{5}-\cdots+\frac{(-1)^{n-1}}{n} $$ ### 回答2: 简单交错幂级数是指一个形如下列形式的幂级数: $$ \sum_{n=0}^{\infty}(-1)^n a_n x^n $$ 其中 $a_n$ 为常数且 $x$ 为实数。这样的级数是交错的,即它的相邻两项正负号相反。 计算简单交错幂级数部分和需要考虑交错级数的相关性质。首先,若 $a_n$ 单调非增且 $\lim\limits_{n\to\infty}a_n=0$,则该级数收敛。其次,设 $S_n=\sum\limits_{k=0}^n(-1)^ka_kx^k$,则有 $|S_n-S|\leq |a_{n+1}x^{n+1}|$,其中 $S$ 为该级数的和。也就是说,级数的部分和与余项之间的误差可以用余项来进行估算。 基于上面的性质,我们可以设计如下函数计算简单交错幂级数部分和: ```python def alternating_power_series(a_list, x, eps): # 初始化级数部分和、余项和当前项 S = a_list[0] R = a_list[1] * x k = 2 # 不断迭代,直到达到精度要求 while abs(R) > eps: S += (-1)**k * a_list[k] * x**k k += 1 R = abs(a_list[k] * x**k) # 返回级数的部分和 return S ``` 这个函数接收三个参数:$a\_list$ 表示常数序列,$x$ 表示幂级数的自变量,$eps$ 表示精度要求函数首先将级数的前两项作为初始化值,然后从 $k=2$ 开始不断迭代,直到余项 $|a_k x^k|$ 小于精度要求 $\epsilon$。函数最终返回级数的部分和 $S$。 举个例子,如果我们要计算以下级数的部分和: $$ \sum_{n=0}^{\infty}(-1)^n\frac{1}{n!}\left(\frac{x}{2}\right)^n $$ 可以使用如下代码: ```python import math a_list = [1, 1/2] x = 1 eps = 1e-6 result = alternating_power_series(a_list, x/2, eps) print(result, math.exp(x/2)) ``` 这里我们传入了常数序列 $[1, \frac{1}{2}]$,自变量 $x=\frac{1}{2}$,精度要求 $\epsilon=10^{-6}$。函数的返回值为 $1.648721$, 而 $\mathrm{e}^{\frac{1}{2}}\approx 1.648721$。可以看到,函数计算得到的结果非常接近真实值。 ### 回答3: 简单交错幂级数是指如下形式的无穷级数: $$ \sum_{n=0}^\infty (-1)^n a_n $$ 其中 $a_n$ 是正实数序列。它的部分和可以表示为: $$ S_k = \sum_{n=0}^k (-1)^n a_n $$ 要计算下列简单交错幂级数部分和: $$ \sum_{n=0}^\infty (-1)^n\frac{x^{2n}}{(2n)!} $$ 就是对应于 $a_n = \frac{x^{2n}}{(2n)!}$ 的情形。其中 $(2n)!$ 表示 $2n$ 的阶乘,即$2n \times (2n-1) \times \cdots \times 2 \times 1$,因此可以通过计算阶乘来实现函数。 我们可以使用一个循环来计算部分和: ```python import math def sin(x, eps=1e-7): s = 0 n = 0 while True: # 计算当前项 a = (-1)**n * x**(2*n) / math.factorial(2*n) # 将当前项加到部分和中 s += a # 如果当前项的绝对值已经小于 eps,就退出循环 if abs(a) < eps: break n += 1 return s ``` 上述代码中,我们使用了 Python 标准库中的 `math.factorial` 函数计算阶乘。在循环中,每次计算一个当前项 $a_n$ 并将其加到部分和 $s$ 中,直到当前项的绝对值小于 $\varepsilon$,即小于一个非常小的数(本例中取 $10^{-7}$)。最后返回部分和 $s$。这个部分和 $S_k$ 将会趋向于无穷级数的和,当 $\varepsilon$ 足够小时,$S_k$ 与无穷级数的和之间的误差也会足够小。 注意,由于在计算幂次时使用了 Python 的乘方运算 `**`,当 $x$ 较大时,可能会出现溢出或增长缓慢的问题。因此,如果需要计算较大的 $x$,最好使用递归算法或快速幂来计算幂次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值