用c语言编写求n!的递归函数,在主函数调用并输出。(n为整型,函数类型为double型
时间: 2024-03-23 16:41:17 浏览: 63
好的,下面是代码:
```c
#include <stdio.h>
double factorial(int n) {
if (n == 0) {
return 1.0;
} else {
return n * factorial(n - 1);
}
}
int main() {
int n;
printf("请输入n的值:");
scanf("%d", &n);
printf("%d! = %.0f\n", n, factorial(n));
return 0;
}
```
首先定义一个递归函数`factorial`,它的参数是整数`n`,返回值是`double`类型。当`n`为0时,返回1;否则递归调用`factorial(n-1)`并将结果乘以`n`。在主函数中读入`n`的值,并调用`factorial`函数计算`n!`的值并输出。
相关问题
用户从键盘输入一个算术表达式,数字都是十进制整型(必须支持负数),运算符支持+-*/(),编写源程序中的 double deal_exp (char *exp) 函数,对这个算术表达式求值,返回结果,不使用栈和递归,用c语言编写
好的,这个问题可以使用表达式解析(Expression Parsing)技术来解决。
表达式解析是指将一个算术表达式转换成一个语法树,然后对语法树进行求值的过程。具体来说,我们可以使用递归下降法(Recursive Descent Parsing)来进行表达式解析。
递归下降法是一种自顶向下的语法分析方法,它通过递归调用函数来解析语法。对于一个算术表达式,我们可以定义如下的语法规则:
```
expr -> term { ("+" | "-") term }*
term -> factor { ("*" | "/") factor }*
factor -> "(" expr ")" | number
number -> digit { digit }
digit -> "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9"
```
按照上述语法规则,我们可以编写一个递归下降的表达式解析器。具体来说,我们可以定义如下的函数:
- `eval_expr()`:对一个表达式求值。
- `eval_term()`:对一个项求值。
- `eval_factor()`:对一个因子求值。
- `eval_number()`:将一个数字字符串转换成一个整数。
下面是具体的源代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int eval_number(char *exp, int *pos) {
int len = strlen(exp);
int num = 0;
while (*pos < len && isdigit(exp[*pos])) {
num = num * 10 + (exp[*pos] - '0');
(*pos)++;
}
return num;
}
int eval_factor(char *exp, int *pos) {
int num = 0;
if (exp[*pos] == '(') {
(*pos)++;
num = eval_expr(exp, pos);
(*pos)++; // skip ')'
}
else {
num = eval_number(exp, pos);
}
return num;
}
int eval_term(char *exp, int *pos) {
int num1 = eval_factor(exp, pos);
while (*pos < strlen(exp) && (exp[*pos] == '*' || exp[*pos] == '/')) {
char op = exp[*pos];
(*pos)++;
int num2 = eval_factor(exp, pos);
if (op == '*') {
num1 *= num2;
}
else {
num1 /= num2;
}
}
return num1;
}
int eval_expr(char *exp, int *pos) {
int num1 = eval_term(exp, pos);
while (*pos < strlen(exp) && (exp[*pos] == '+' || exp[*pos] == '-')) {
char op = exp[*pos];
(*pos)++;
int num2 = eval_term(exp, pos);
if (op == '+') {
num1 += num2;
}
else {
num1 -= num2;
}
}
return num1;
}
double deal_exp(char *exp) {
int pos = 0;
int res = eval_expr(exp, &pos);
return res;
}
```
使用这个函数,我们可以方便地对一个算术表达式求值,而不需要使用栈和递归。
用C语言编写(2)已知f为单链表的表头指针,链表中存储的都 是整型数据,试写出实现下列运算的递归算法:①求链表中的最大整数; ②求链表的结点个数; ③求所有整数的平均值。
在C语言中,我们可以利用递归来遍历链表并执行相应的计算。这里提供三种递归函数的示例实现:
1. 求链表中的最大整数:
```c
typedef struct ListNode {
int val;
struct ListNode* next;
} ListNode;
int findMax(ListNode* f) {
// 基本情况:如果链表为空,则返回INT_MIN作为最大值
if (f == NULL || f->next == NULL) {
return f->val;
}
// 递归情况:比较当前节点值和其后节点的最大值
return MAX(f->val, findMax(f->next));
}
```
其中,`MAX`是一个宏定义,用于获取两个整数中的较大者。
2. 求链表的结点个数:
```c
int countNodes(ListNode* f) {
// 基本情况:如果链表为空,则返回0
if (f == NULL) {
return 0;
}
// 递归情况:当前节点加上剩余节点数量
return 1 + countNodes(f->next);
}
```
3. 求所有整数的平均值(假设链表非空且所有元素都是正整数):
```c
double average(ListNode* f, double sum, int count) {
// 基本情况:当遍历到链表末尾时,返回总和除以计数
if (f->next == NULL) {
return sum / count;
}
// 递归情况:累加当前节点值,增加计数,并继续递归
return average(f->next, sum + f->val, count + 1);
}
// 初始化平均值
double calcAverage(ListNode* f) {
return average(f, 0.0, 0); // 从0开始累加和和计数
}
```
每个函数都会处理链表的基本情况(空链表)以及递归调用自身以处理更深入的部分。在实际应用时,记得检查函数返回值的有效性和边界条件。
阅读全文