用函数的递归调用求a的n次方。C语言
时间: 2024-02-09 07:07:55 浏览: 259
可以使用以下递归函数来计算 a 的 n 次方:
```c
double power(double a, int n) {
if (n == 0) return 1;
if (n == 1) return a;
if (n < 0) return 1 / power(a, -n);
double half = power(a, n / 2);
if (n % 2 == 0) return half * half;
else return half * half * a;
}
```
这个函数会根据指数的正负和奇偶性来进行递归计算,如果指数为 0,返回 1;如果指数为 1,返回底数;如果指数为负数,返回 1 除以正数幂的结果;否则,将指数拆成两个相等的部分,分别计算后再相乘,如果指数为奇数,则还需要额外乘以一个底数。
相关问题
定义函数int fun(int m,int n)求m的n次方,用函数递归调用方法,主函数调用fun进行测试用C语言
好的,下面是一个用 C 语言定义并实现 `int fun(int m, int n)` 函数的例子,这个函数用于计算 \( m^n \),即求 m 的 n 次方,并使用了递归的方式。
### 使用递归实现幂运算
```c
#include <stdio.h>
// 定义一个整数类型的函数,接收两个整型参数m和n返回m的n次方
int fun(int m, int n) {
// 基本情况:任何非零数字的0次幂等于1;而0的正整数次幂等于0。
if (n == 0)
return 1;
// 如果指数小于0,则表示负指数,这里我们假设只处理非负整数作为指数的情况
else if(n<0){
printf("Error:n is negative!\n");
return -1; // 错误标识
}
else
// 核心递归逻辑:将原问题分解为更小的问题实例,直到达到基本条件为止。
return m * fun(m, n - 1);
}
void main() {
int base, exp;
printf("请输入底数base: ");
scanf("%d", &base);
printf("请输入指数exp(应为非负): ");
scanf("%d", &exp);
// 调用递归函数fun来计算结果
int result = fun(base, exp);
if(result != -1){ // 排除错误情况下的输出
printf("%d 的 %d 次方的结果是:%d\n", base, exp, result);
}
}
```
此程序首先包含了标准输入输出库 `<stdio.h>` ,接着定义了一个名为`fun`的递归函数来进行乘法累加操作,最后通过用户交互的形式获取基数与指数值并在屏幕上打印出最终的结果。请注意,在实际应用中对于非常大的数值组合可能会超出整数范围导致溢出等问题发生,所以需要谨慎考虑数据类型的选择以及对特殊情况做出适当处理。
此外,这段代码默认指数是非负整数。如果允许负数作为指数的话,则还需要引入浮点数支持及相应地修改算法结构以满足数学上的定义(例如返回\( 1/m^{-n} \))。
用C语言编写递归函数求x的n次方, 并调用此函数求2的5次方。
以下是用C语言编写递归函数求x的n次方的代码:
```c
#include <stdio.h>
double power(double x, int n) {
if (n == 0) {
return 1;
} else if (n % 2 == 0) {
double y = power(x, n / 2);
return y * y;
} else {
double y = power(x, (n - 1) / 2);
return x * y * y;
}
}
int main() {
double result = power(2, 5);
printf("2的5次方等于%.0f\n", result);
return 0;
}
```
在这个递归函数中,如果n等于0,返回1;如果n是偶数,返回x的n/2次方的平方;如果n是奇数,返回x乘以x的(n-1)/2次方的平方。这个函数的时间复杂度是O(log n),因为每次递归都将n减半,所以最多需要递归log n次。
在main函数中,我们调用了power函数,求2的5次方,得到结果32。
阅读全文
相关推荐














