用C语言编写一个函数实现n^k(n的k次方),使用递归实现。
时间: 2024-02-03 11:02:43 浏览: 115
好的,以下是一个使用递归实现n^k的C函数:
```c
#include <stdio.h>
int power(int n, int k) {
if (k == 0) {
return 1;
} else if (k % 2 == 0) {
return power(n * n, k / 2);
} else {
return n * power(n, k - 1);
}
}
int main() {
int n, k;
printf("请输入底数n和指数k:");
scanf("%d%d", &n, &k);
printf("%d的%d次方是%d\n", n, k, power(n, k));
return 0;
}
```
这个函数与之前提供的Python版本的函数非常相似。当k为0时,返回1,递归终止。如果k为偶数,则可以将n^k拆分为(n^2)^(k/2),可以递归计算(n^2)^(k/2)。如果k为奇数,则可以将n^k拆分为n * n^(k-1),同样可以递归计算n^(k-1)。
相关问题
数据结构与算法中使用C语言编写,在VC++中运行,并在每行代码中加入注释 题目: 一、设有三个元素XYZ顺序进栈(进的过程中允许出栈),若出栈顺序为XZY,请用顺序栈实现这一过程。 二、设有三个元素XYZ顺序进栈(进的过程中允许出栈),若出栈顺序为YZX,请用链栈实现这一过程。 三、编写一个函数实现n^k(n的k次方),使用递归实现。
一、使用顺序栈实现XZY的出栈顺序:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct {
int data[MAXSIZE];
int top;
} SqStack;
void initStack(SqStack *s) {
s->top = -1;
}
int push(SqStack *s, int x) {
if (s->top == MAXSIZE - 1) {
return 0;
}
s->top++;
s->data[s->top] = x;
return 1;
}
int pop(SqStack *s, int *x) {
if (s->top == -1) {
return 0;
}
*x = s->data[s->top];
s->top--;
return 1;
}
int getTop(SqStack *s, int *x) {
if (s->top == -1) {
return 0;
}
*x = s->data[s->top];
return 1;
}
int main() {
SqStack s;
int x, y, z;
initStack(&s);
push(&s, 1); // X入栈
push(&s, 2); // Y入栈
push(&s, 3); // Z入栈
pop(&s, &x); // X出栈
pop(&s, &z); // Z出栈
pop(&s, &y); // Y出栈
printf("%d %d %d\n", x, y, z); // 输出X Y Z的出栈顺序
return 0;
}
```
二、使用链栈实现YZX的出栈顺序:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct LNode {
int data;
struct LNode *next;
} LNode, *LinkList;
void initStack(LinkList *s) {
*s = NULL;
}
int push(LinkList *s, int x) {
LNode *p = (LNode *) malloc(sizeof(LNode));
p->data = x;
p->next = *s;
*s = p;
return 1;
}
int pop(LinkList *s, int *x) {
if (*s == NULL) {
return 0;
}
*x = (*s)->data;
LNode *p = *s;
*s = (*s)->next;
free(p);
return 1;
}
int getTop(LinkList s, int *x) {
if (s == NULL) {
return 0;
}
*x = s->data;
return 1;
}
int main() {
LinkList s;
int x, y, z;
initStack(&s);
push(&s, 1); // X入栈
push(&s, 2); // Y入栈
push(&s, 3); // Z入栈
pop(&s, &z); // Z出栈
pop(&s, &y); // Y出栈
pop(&s, &x); // X出栈
printf("%d %d %d\n", y, z, x); // 输出Y Z X的出栈顺序
return 0;
}
```
三、使用递归实现n^k:
```c
#include <stdio.h>
double pow(int n, int k) {
if (k == 0) {
return 1;
}
double t = pow(n, k / 2);
if (k % 2 == 0) {
return t * t;
} else {
return t * t * n;
}
}
int main() {
int n = 2, k = 5;
double ans = pow(n, k);
printf("%d的%d次方为%.0lf", n, k, ans);
return 0;
}
```
用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。
阅读全文