任务描述
本关任务:编写递归函数方法求x的n次方 (要求n>=0)。
相关知识
递归法
在定义一个过程或函数时出现调用本过程或本函数的成分,称之为递归。
若调用自身,称之为直接递归。若过程或函数p调用过程或函数q,而q又调用p,称之为间接递归。
下面主要介绍直接递归。
一般地,递归模型由两部分组成,一部分为递归出口,它给出了递归的终止条件。另一部分为递归体,它确定递归求解时的递推关系。
例如:计算n
阶乘的程序在数学上可以定义为:
fact(n)={1n×fact(n−1)n=0n>0
则递归算法求n
阶乘的伪代码为:
int fact(int n){
if(n == 0)
return 1;
else
return n * fact(n - 1);
}
上面例子中的f(0)=1
就是递归出口; f(n)=n*f(n-1)
就是递归体。
要注意一下两点:
- 递归调用的次数必须是有限的。
- 必须有结束递归的条件来终止递归。
递归算法求解过程的特征:
- 先将不能直接求解的问题转换成若干个相似的小问题,通过分别求解各子问题,最后获得整个问题的解。
- 当这些子问题不能直接求解时,还可以再将它们转换成若干个更小的子问题,如此反复进行,直到遇到递归出口为止。
- 这种自上而下将问题分解、求解,再自上而下引用、合并,求出最后解答的过程称为递归求解过程。这是一种分而治之的算法设计方法。
求x的n次方的求解过程可以写出递归定义:
编程要求
根据提示,在右侧编辑器补充代码。
测试说明
平台会对你编写的代码进行测试:
测试输入: 2.3,5
预期输出: 64.363430
测试输入: 2.3,-5
预期输出: n<0,data error!
#include <stdio.h>
double power(double x,int n)
{
/********** Begin **********/
double result = 1.0;
if (n < 0)
{
printf("n<0,data error!\n");
return 0;
}
else
{
for (int i = 0; i < n; ++i)
{
result *= x;
}
return result;
}
/********** End **********/
}
int main( )
{
int n;
double x, y;
scanf("%lf,%d",&x,&n);
y = power(x,n);
if(y!=0)
{
printf("%lf\n",y);
}
return 0;
}