用C语音实现,编写函数用递归的方法求n!的值,在主函数中调用。
时间: 2024-03-26 22:34:20 浏览: 56
好的,下面是用C语言编写的递归函数,用于计算n!的值。
```c
#include <stdio.h>
int factorial(int n) {
if (n == 0) {
return 1;
} else {
return n * factorial(n-1);
}
}
int main() {
int n = 5;
int result = factorial(n);
printf("%d! = %d\n", n, result);
return 0;
}
```
在这个程序中,我们定义了一个名为`factorial`的函数,它采用递归的方式计算n的阶乘。如果n等于0,则返回1。否则,函数会调用自身来计算(n-1)的阶乘,然后将其乘以n,得到n的阶乘。
在`main`函数中,我们定义了一个变量n,并将其设为5。我们然后调用`factorial`函数,将n作为参数传递给它,并将返回值存储在名为`result`的变量中。最后,我们使用printf函数将结果打印到控制台上。
你可以将n替换为任何你想要计算阶乘的整数。
相关问题
用递归函数实现1+2+3……n的和.用c语音编写
好的,下面是用递归函数实现1+2+3……n的和的C语言代码:
```c
#include <stdio.h>
int sum(int n){
if(n == 1){
return 1;
}
else{
return n + sum(n-1);
}
}
int main(){
int n = 10;
int result = sum(n);
printf("1+2+3+...+%d = %d\n", n, result);
return 0;
}
```
这个递归函数的思路和Python版本一样:如果n等于1,那么直接返回1,否则返回n加上n-1的和。在主函数中,我们定义了n的值为10,然后调用sum函数计算1+2+3+...+n的和,最后将结果输出到控制台上。
c语音试编写程序,以图的邻接表表示为存储结构,从键盘输入一个无向图,包括连通和不连通两种情况,判断该图是否连通,如果不连通输出所有的连通分量 (1)以图的邻接表表示为存储结构建立无向图。 (2)编写无向图的深度搜索函数。 (3)对图进行编历时,对搜索函数的调用次数进行统计n,若n=1,则该无向图是连通的,否则不连通,n为连通分量的个数。 (4)在主函数中调用菜单函数调试程序。
以下是C语言代码实现:
```
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
typedef struct ArcNode
{
int adjvex; // 邻接点的位置
struct ArcNode *nextarc; // 指向下一个邻接点的指针
}ArcNode;
typedef struct VertexNode
{
int data; // 顶点信息
struct ArcNode *firstarc; // 指向第一个邻接点的指针
}VertexNode, AdjList[MAX_VERTEX_NUM];
typedef struct
{
AdjList vertices; // 邻接表
int vexnum, arcnum; // 顶点数和边数
}Graph;
int visited[MAX_VERTEX_NUM]; // 访问标记数组
// 无向图的深度优先搜索
void DFS(Graph G, int v, int *count)
{
visited[v] = 1;
ArcNode *p = G.vertices[v].firstarc;
while (p)
{
if (!visited[p->adjvex])
{
DFS(G, p->adjvex, count);
}
p = p->nextarc;
}
(*count)++;
}
// 判断无向图是否连通
int IsConnected(Graph G)
{
int count = 0;
for (int i = 0; i < G.vexnum; i++)
{
visited[i] = 0;
}
DFS(G, 0, &count);
if (count == G.vexnum)
{
return 1; // 连通
}
else
{
return count; // 不连通,返回连通分量的个数
}
}
// 建立无向图的邻接表存储结构
void CreateGraph(Graph *G)
{
printf("请输入顶点数和边数:");
scanf("%d%d", &(G->vexnum), &(G->arcnum));
getchar(); // 吃掉换行符
printf("请输入各个顶点的信息:\n");
for (int i = 0; i < G->vexnum; i++)
{
printf("第%d个顶点:", i + 1);
scanf("%d", &(G->vertices[i].data));
G->vertices[i].firstarc = NULL;
}
printf("请输入边的信息:\n");
for (int k = 0; k < G->arcnum; k++)
{
int i, j;
printf("第%d条边:", k + 1);
scanf("%d%d", &i, &j);
ArcNode *p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = j - 1;
p->nextarc = G->vertices[i - 1].firstarc;
G->vertices[i - 1].firstarc = p;
p = (ArcNode *)malloc(sizeof(ArcNode));
p->adjvex = i - 1;
p->nextarc = G->vertices[j - 1].firstarc;
G->vertices[j - 1].firstarc = p;
}
}
// 输出无向图的邻接表存储结构
void PrintGraph(Graph G)
{
printf("无向图的邻接表存储结构如下:\n");
for (int i = 0; i < G.vexnum; i++)
{
printf("%d: ", G.vertices[i].data);
ArcNode *p = G.vertices[i].firstarc;
while (p)
{
printf("%d ", G.vertices[p->adjvex].data);
p = p->nextarc;
}
printf("\n");
}
}
// 菜单函数
void menu()
{
printf("**********操作菜单**********\n");
printf("1. 建立无向图\n");
printf("2. 输出无向图的邻接表存储结构\n");
printf("3. 判断无向图是否连通\n");
printf("0. 退出\n");
printf("*****************************\n");
}
int main()
{
Graph G;
int choice;
do
{
menu();
printf("请选择操作(0-3):");
scanf("%d", &choice);
switch (choice)
{
case 1:
CreateGraph(&G);
break;
case 2:
PrintGraph(G);
break;
case 3:
int count = IsConnected(G);
if (count == 1)
{
printf("该无向图是连通的!\n");
}
else
{
printf("该无向图不连通,有%d个连通分量。\n", count);
}
break;
case 0:
break;
default:
printf("输入有误,请重新输入!\n");
break;
}
} while (choice != 0);
return 0;
}
```
注意事项:
1. 本代码实现中,图中每个顶点的信息采用整数表示,可以根据需要修改。
2. 本代码实现中,无向图的深度优先搜索使用递归方式实现,可以使用非递归方式实现,但本质相同。
阅读全文