2305020512


私信TA

用户名:dotcpp0693502

访问量:237

签 名:

人云异韵

等  级
排  名 10237
经  验 1101
参赛次数 0
文章发表 3
年  龄 18
在职情况 学生
学  校 河海大学
专  业 电气工程及其自动化

  自我简介:

解题思路:有些复杂,希望有大佬指正。整体思路自然是设置两个可以递归的函数,其中Sn作为外函数,不仅可以调用自身,还可以调用An。

首先是看一看这个被调用的An函数,An(n)输出结构其实是sin(1-An(n-1)),1的位置上则会有逐一变大的数,负正也会交替,所以要用逆序数组d解决逐一变大的问题(其实用局部静态变量也行),用char{‘+’,‘-’}解决符号更替。

接下来看Sn就很简单,每次向前调用即可,直到调用A1为止。

注意事项:下面程序中数组b和数组d是不一样的,b是给Sn使用的,被主函数赋值后不再改变,d则是每次被调用给An时,需要根据An的最里输出sin(n)的n,也就是本函数的形参而相应改变,否则会出现形参n都为同一数的情况。

另外,一定要注意递归结束条件!!!

void An(int n){

    static int k=1;

    if(n==1)printf("sin(%d)",b[n]);

    else{

        printf("sin(%d%c",b[n],c[k]);

        k=(k+1)%2;

        An(n-1);

        printf(")");

    }

}



参考代码:

#include<stdio.h>

int b[202],d[202],k=1;

char c[2]={'+','-'};

void Dn(int n){

    int i,r;

    r=n;

    for(i=1;i<=n;i++){

        d[i]=r;

        r--;

    }

}

void An(int n){

    if(n==1)printf("sin(%d)",d[n]);

    else{

        printf("sin(%d%c",d[n],c[k]);

        k=(k+1)%2;

        An(n-1);

        printf(")");

    }

}

void Sn(int n){

    if(n==1){

        k=1;

        Dn(n);

        An(n);

        printf("+%d",b[n]);

    }

    else{

        printf("(");

        Sn(n-1);

        printf(")");

        k=1;

        Dn(n);

        An(n);

        printf("+%d",b[n]);

    }

}

int main(){

    int i,n,r;

    scanf("%d",&n);

    r=n;

    for(i=1;i<=n;i++){

        b[i]=r;

        r--;

    }

    Sn(n);

    return 0;

}


 

0.0分

1 人评分

  评论区

  • «
  • »