09习题2.6 递归求简单交错幂级数的部分和(函数题)【PTA浙大版《数据结构(第2版)》题目集】
1.原题链接
习题2.6 递归求简单交错幂级数的部分和 (pintia.cn)
2.题目描述
习题2.6 递归求简单交错幂级数的部分和
本题要求实现一个函数,计算下列简单交错幂级数的部分和:
$ f(x, n) = x - x^2 + x^3 - x^4 + \cdots + (-1){n-1}xn $
函数接口定义:
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
3.参考答案
本题主要复习C语言中已经学过的递归。
double fn( double x, int n ){
if(n == 1 )return x ;
else return x*(1 - fn(x,n-1)) ;
}
4.解题思路
本题用循环很容易计算出结果,但本题要求用递归来计算。
-
当
n==1
时,$ f(x, 1) = x $,这是表达式最基本的情况,可以用来作为递归的终止条件。 -
当
n==2
时,$ f(x, 2) = x - x^2 ,此时在 ‘ n = = 1 ‘ 的基础上增加了后面的 ,此时在`n==1`的基础上增加了后面的 ,此时在‘n==1‘的基础上增加了后面的- x^2$,如果这样考虑就成了循环计算的解法,递归的解法通常是对算式整体改变,让后续计算采用相同的策略。要把算式从 $ f(x, 1) = x $ 变为 f ( x , 2 ) = x − x 2 = x ( 1 − x ) f(x, 2) = x - x^2=x(1 - x) f(x,2)=x−x2=x(1−x),这里可以有两种计算方式:-
第一种方式:看作在 f ( x , 1 ) f(x, 1) f(x,1) 的基础上乘以了 ( 1 − x ) (1 - x) (1−x) ;
-
第二种方式:看作 f ( x , 1 ) f(x, 1) f(x,1) 取负值得到 − x -x −x,再加以得到 1 − x 1 - x 1−x,然后再乘以 x x x,得到 x ( 1 − x ) x(1 - x) x(1−x)。
至于哪种方式可以让更大的
n
采用相同的运算方式,可以先递推到下一步寻找规律。 -
-
当
n==2
时,$ f(x, 3) = x - x^2+ x^3 ,要让 ,要让 ,要让f(x, 2) 变为 变为 变为 f(x, 3)$,乘以 ( 1 − x ) (1 - x) (1−x) 是不行的,所以应该采用上述第二种计算方式 $ f(x, 3)=x(1 - fn(x,2))$。 -
那么得到
n>1
时的递归关系式:f(x,n) = x*(1 - fn(x,n-1))
。
5.答案详解
//计算简单交错幂级数的部分和,x是项的底数,n是项的指数,奇数项的系数为正,偶数项的系数为负
double fn( double x, int n ){
if(n == 1 )return x ; //递归的终止调件
else return x*(1 - fn(x,n-1)) ; //n>1时的递归关系
}