解题思路:有些复杂,希望有大佬指正。整体思路自然是设置两个可以递归的函数,其中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 人评分
C语言程序设计教程(第三版)课后习题7.2 (C语言代码)浏览:533 |
C二级辅导-求偶数和 (C语言代码)浏览:626 |
C语言程序设计教程(第三版)课后习题12.3 (C语言代码)浏览:821 |
最长单词 (C语言代码)浏览:1363 |
C语言程序设计教程(第三版)课后习题6.11 (C语言代码)浏览:2080 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:1299 |
回文数字 (C语言代码)浏览:2510 |
Tom数 (C语言代码)浏览:725 |
数组与指针的问题浏览:716 |
C语言程序设计教程(第三版)课后习题7.3 (C语言代码)浏览:403 |