目录
代码实现
#include<stdio.h>
double my_pow(int n, int k)
{
if (k > 0)
return n * my_pow(n, k - 1);
else if (k < 0)
return 1.0 / my_pow(n, -k);
else
return 1;
}
int main()
{
//输入
int n = 0;
int k = 0;
scanf("%d %d", &n, &k);
//计算并返回
double ret = my_pow(n, k);
//输出
printf("%d的%d次方 = %f", n, k, ret);
return 0;
}
代码验证
当k为正数时
当k为0时
当k为负数时
代码讲解
函数体的讲解
当k为0时:n的k次方 = 1,因为任何数的0次方都是1
return 1;
当k大于0时:n的k次方 = n * my_pow(n, k-1),因为2的3次方 = 2 * 2的2次方
return n * my_pow(n, k - 1);
当k小于0时:n的k次方 = 1.0 / my_pow(n, -k),例如 2 的 -3 次方 = 1 / 2的3次方
注意:输入k时输入的是 -3,所以要在k前面加个负号,负负得正,且等式两端至少要有一个浮点数,得出的结果才是小数,所以是1.0
return 1.0 / my_pow(n, -k);
由以上3个公式就可写出my_pow函数体,并且是以递归实现
代码运行时过程的讲解
double my_pow(int n, int k)
{
if (k > 0)
return n * my_pow(n, k - 1);
else if (k < 0)
return 1.0 / my_pow(n, -k);
else
return 1;
}
当k = 0时
任何整数的0次方都为1,所以不论n为几,直接返回1即可
当k > 0时
例如:n = 2,k = 2
- 第一次进入my_pow函数:if判断k>0,return 2 * my_pow(2, 2-1),所以要再次进入函数
- 进入函数时:n = 2,k = 1
- 第二次进入my_pow函数:if判断k>0,return 2 * my_pow(2, 1-1),所以要再次进入函数
- 进入函数时:n = 2,k = 0
- 第三次进入my_pow函数:if判断k=0,直接 return 1
- 回到第二次进入my_pow函数:return 2 * my_pow(2, 1-1) 中的 my_pow(2, 1-1) 替换成 1,也就是 return 2 * 1 == return 2
- 回到第一次进入my_pow函数:return 2 * my_pow(2, 2-1) 中的 my_pow(2, 2-1) 替换成 2,也就是 return 2 * 2 == return 4
- 最后返回的结果也就是4,事实证明 2 的 2 次方也就是4
当k < 0时
例如:n = 2,k = -2
- 由 1.0 / my_pow(n, -k) 中的 -k 把 k 负负得正变为正数
- 变为正数后即可使用 k > 0时的方法递归
- 此时的n = 2,k = 2
- 递归结束后 1.0 除以 my_pow(n, -k) 的结果,也就是1.0 / 4 = 0.125,最后返回即可