递归是函数体中调用自己,如果不加控制,将无休止的调用自己,直到堆栈溢出。循环是反复执行某一段区域内的代码,如果不加控制,就会形成死循环。所以不管是递归还是循环,都要设定一定的条件,以结束递归或循环。实际问题中,有一些问题是递归的,这样的问题使用递归程序解决感觉会自然些,程序也会简单些,但是,递归要经常调用函数,开销(内存、时间)大,有些问题就不适宜使用,循环不需要调用自身,甚至可以不调用函数,效率高,不过,要将递归问题改成非递归,可能就要动动脑筋。上例中pow2 函数实现部分指数计算功能,(b, n-1) =3 这个提法有问题,因为递归调用时,在返回之前系统堆栈上有一大堆(从第一次调用知道条件满足时的次数)的该递归函数,条件满足后这一系列的函数依次返回。上述函数运行过程是这样的: 执行主函数的 pow2(3, 2); 后:1: b = 3 n = 2 此时 n 0; pow2 调用自身(即递归调用): pow2(b, n-1) * b 后:2: b = 3 n = 1 此时 n 0; pow2 调用自身(即递归调用): pow2(b, n-1) * b 后:3: b = 3 n = 0 此时 n = 0, if (n = 0) 条件满足 1; 递归函数第一次(函数最后依次递归调用)返回,值为 14: 上一次 pow2(b, n-1) 返回值为 1,return pow2(b, n-1) * b; 所以本次(第2次)返回 35: 上一次 pow2(b, n-1) 返回值为 3,return pow2(b, n-1) * b; 所以本次(第1次)返回 96: 函数main得到 pow2 的返回值 9
成都创新互联公司于2013年开始,先为鄂尔多斯等服务建站,鄂尔多斯等地企业,进行企业商务咨询服务。为鄂尔多斯企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
/*x^n的值必须小于32767,否则输出的就是负数。因为,int只有这么大,正常的pow函数应该是float型或是double型,参数也应是float或是double型。*/
#include stdio.h
int power(int x,int n)
{
if (n1)
{
return x*power(x,n-1);
}
else
{
if (n0)
return x;
else
return 1;
}
}
void main()
{
int x,n;
printf("input x,n:");
scanf("%d%d",x,n);
printf("%d",power(x,n));
getch();
clrscr();
}
double power_negative(double n,int p)
{
double pow = 1;
int q;
q=-p;
if(q0)
pow = power_negative(n,1-q) / n;
return pow;
}
改成这样,虽然你那个写的是递归调用,但是返回的却是1/pow,那么就会是0.5 * 2 * 0.5 * 2 * 0.5这样的形式返回,所以最终无论是多少,结果都是0.5,而且递归时应该用1-q,因为你调用负数求幂,必须使参数为负才会正确
#include stdio.h
#include math.h
int fact(int n) //递归函数实现1+2+3+。。。+n
{
if(n==1)
return n;
else
return n+fact(n-1);
}
double cal(int x,int n) //实现计算功能
{
return pow(x,n)/fact(n); //pow()为指数函数
}
void main()
{
int x,n;
printf("请输入x和n,用逗号分开:");
scanf("%d,%d",x,n); //输入两个数
printf("%lf\n",cal(x,n)); //输出结果
}