09习题2.6 递归求简单交错幂级数的部分和(函数题)【PTA浙大版《数据结构(第2版)》题目集】

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)=xx2=x(1x),这里可以有两种计算方式:

    • 第一种方式:看作在 f ( x , 1 ) f(x, 1) f(x,1) 的基础上乘以了 ( 1 − x ) (1 - x) (1x)

    • 第二种方式:看作 f ( x , 1 ) f(x, 1) f(x,1) 取负值得到 − x -x x,再加以得到 1 − x 1 - x 1x,然后再乘以 x x x,得到 x ( 1 − x ) x(1 - x) x(1x)

    至于哪种方式可以让更大的n采用相同的运算方式,可以先递推到下一步寻找规律。

  • n==2时,$ f(x, 3) = x - x^2+ x^3 ,要让 ,要让 ,要让f(x, 2) 变为 变为 变为 f(x, 3)$,乘以 ( 1 − x ) (1 - x) (1x) 是不行的,所以应该采用上述第二种计算方式 $ 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时的递归关系
}

猜你喜欢

转载自blog.csdn.net/weixin_40171190/article/details/129944055