分别设计递归与非递归函数 int age(int n),实现问题求解:计算学生的 年龄。已知学生序列中年龄最小的学生为 10 岁,其余学生的年龄一个比一个大 2 岁,求第 n 个学生的年龄。并编写 main()函数进行测试。
时间: 2024-05-10 15:19:15 浏览: 6
递归函数实现:
```
int age(int n) {
if (n == 1) {
return 10;
} else {
return age(n-1) + 2;
}
}
```
非递归函数实现:
```
int age(int n) {
int age = 10;
for (int i = 2; i <= n; i++) {
age += 2;
}
return age;
}
```
main()函数测试代码:
```
#include <stdio.h>
int age(int n);
int main() {
int n;
printf("请输入学生序列中的学生数:");
scanf("%d", &n);
printf("第 %d 个学生的年龄为:%d\n", n, age(n));
return 0;
}
```
注意:输入的学生数必须大于等于 1,否则程序会出错。
相关问题
写出计算n阶乘的递归函数int myfun jc(int n)
好的,下面是计算n阶乘的递归函数int myfun jc(int n)的代码实现:
```c++
int myfun_jc(int n)
{
if(n == 0 || n == 1)
{
return 1;
}
else
{
return n * myfun_jc(n-1);
}
}
```
这个递归函数的思路是:当输入n为0或1时,直接返回1;否则,计算n * (n-1)的阶乘。这样就可以递归地调用myfun_jc函数,直到n为0或1时终止递归。
已知Ackermann函数定义如下: 借助链栈,用c语言实现计算Ack(m,n)的非递归算法。
C语言实现Ackermann函数的非递归算法,可以借助链栈来实现。具体步骤如下:
1. 定义一个链栈结构体,包含栈顶指针和栈的最大容量。定义一个函数来初始化栈。
2. 定义一个函数来判断栈是否为空。
3. 定义一个函数来判断栈是否已满。
4. 定义一个函数来在栈顶插入一个元素。
5. 定义一个函数来从栈顶删除一个元素并返回其值。
6. 定义一个函数来获取栈顶元素的值。
7. 定义一个函数来计算Ackermann函数的值,其中借助链栈来实现非递归算法。
下面是C语言代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#define STACK_SIZE 1000
// 链栈结构体
typedef struct {
int top;
int arr[STACK_SIZE];
} Stack;
// 初始化链栈
void init_stack(Stack* stack) {
stack->top = -1;
}
// 判断栈是否为空
int is_empty(Stack* stack) {
return stack->top == -1;
}
// 判断栈是否已满
int is_full(Stack* stack) {
return stack->top == STACK_SIZE - 1;
}
// 在栈顶插入一个元素
void push(Stack* stack, int value) {
if (is_full(stack)) {
printf("Stack overflow!\n");
exit(EXIT_FAILURE);
}
stack->arr[++stack->top] = value;
}
// 从栈顶删除一个元素并返回其值
int pop(Stack* stack) {
if (is_empty(stack)) {
printf("Stack underflow!\n");
exit(EXIT_FAILURE);
}
return stack->arr[stack->top--];
}
// 获取栈顶元素的值
int peek(Stack* stack) {
if (is_empty(stack)) {
printf("Stack is empty!\n");
exit(EXIT_FAILURE);
}
return stack->arr[stack->top];
}
// 计算Ackermann函数的值
int ackermann(int m, int n) {
Stack stack;
init_stack(&stack);
push(&stack, m);
push(&stack, n);
while (!is_empty(&stack)) {
n = pop(&stack);
m = pop(&stack);
if (m == 0) {
push(&stack, n + 1);
} else if (m > 0 && n == 0) {
push(&stack, m - 1);
push(&stack, 1);
} else if (m > 0 && n > 0) {
push(&stack, m - 1);
push(&stack, m);
push(&stack, n - 1);
}
if (is_empty(&stack)) {
return n;
}
}
}
int main() {
int m = 3, n = 4;
int result = ackermann(m, n);
printf("Ackermann(%d, %d) = %d\n", m, n, result);
return 0;
}
```
这个算法的时间复杂度是指数级别的,因此只能用于计算较小的Ackermann数。