//递归实现n的k次方
double my_pow(double n, int k)//考虑到n可能为小数,但k为小数的时候就太复杂了,就不管了
{
if (0 == k)//任何数的0次方都为1
{
return 1;
}
else if (k > 0)
{
return n * my_pow(n, k - 1);
}
else if(k < 0)//次方(指数)为负数,底数变成倒数,指数变成相反数
{
return 1.0 / n * my_pow(1.0 / n, (-k) - 1);
}
}
int main()
{
double n = 0;
int k = 0;
while (scanf("%lf %d", &n, &k) != EOF)//实现多组输入
{
double ret = my_pow(n, k);
printf("%lf\n", ret);
}
return 0;
}
函数递归的注意事项
-
递归层次不能太深(太多次递归)
原因是每次函数递归都会在栈区开辟一块空间,用于存放函数的临时变量,多次开辟会导致栈区的内存使用殆尽,而出现栈溢出的情况(stack overflow)
顺便再安利一个号称“程序员的知乎”的网站https://stackoverflow.com/
看这个网站名字正好翻译为栈溢出。 -
存在限制条件,当满足这个限制条件的时候,递归便不在继续,
每次递归调用之后越来越接近这个限制条件。 -
递归的核心思想是:大事化小