前言
PTA上的基础函数题第10章全是用递归求解题目,非常好的学习资料,找个机会归纳一下,加强对递归的理解。
正文
练习10-1 使用递归函数计算1到n之和
本题要求实现一个用递归计算1+2+3+…+n的和的简单函数。
函数接口定义:int sum( int n );
int sum( int n ){
int re=0;
if(n<0)//结束条件
re=0;
else if(n){
re=sum(n-1)+n;//回归时的算式
}
return re;//递回
}
习题10-2 递归求阶乘和
本题要求实现一个计算非负整数阶乘的简单函数,并利用该函数求 1!+2!+3!+...+n! 的值。
函数接口定义: double fact( int n ); double factsum( int n );
double fact( int n ){
double sum;
if(n<=1)//结束条件
sum=1;
else
sum=fact(n-1)*n;//求n的阶层
return sum;
}
double factsum( int n ){/*求和*/
double sum;
if(n==0)//结束条件
sum=0;
else
sum=factsum(n-1)+fact(n); //和上一题的求和相似,n变成n!,所以用相应的求阶层函数fact(n)!
return sum;
}
习题10-3 递归实现指数函数
本题要求实现一个计算x^n(n≥1)的函数。
函数接口定义: double calc_pow( double x, int n );
double calc_pow( double x, int n ){
double sum;
if(n==0)//结束条件
sum=1;
/* else if(n==1)
sum=x;*/
else{
sum=calc_pow(x,n-1)*x; //回归过程
}
return sum;
}
习题10-4 递归求简单交错幂级数的部分和
本题要求实现一个函数,计算下列简单交错幂级数的部分和:
f(x,n)=x−x2+x3 −x4 +⋯+(−1)n−1 xn
函数接口定义: double fn( double x, int n );
#double fn( double x, int n )
{
int i;
double f=1.0;
/*求阶层*/
for(i=1;i<=n;i++)
f=f*x;
/*改变符号*/
if(n%2==0)
f=f*(-1);
/*递归*/
if(n==1)//结束条件
return x;
else return (f+fn(x,n-1));//参看第一和第二题
}
习题10-7 十进制转换二进制
本题要求实现一个函数,将正整数n转换为二进制后输出。
函数接口定义: void dectobin( int n );
void dectobin( int n ){
int re;
if(n==0)
printf("0");
else if(n==1)
printf("1");
else{
dectobin(n/2);
re=n%2;
printf("%d",re);
}
}
习题10-8 递归实现顺序输出整数
本题要求实现一个函数,对一个整数进行按位顺序输出。
函数接口定义: void printdigits( int n );
void printdigits( int n ){
int re;
if(n<=9)//结束条件,限制n为个位数
printf("%d\n",n);
else{
printdigits(n/10);
re=n%10;
printf("%d\n",re);
}
}
再来看下这张图
房间里的就是你编写的递归体,是不是更清楚了呢
递归并不像我想的那种顺序进行代码的运算 n先是减小到递归出口,就是像栈,先压入后弹出,后压入先弹出!