C语言小题 求cnt的大小

一道C语言的小题 求cnt的大小

#include <stdio.h>
int cnt = 0;
int fib(int n) {
	cnt++;
	if (n == 0) {
		return 1;
	}
	else if( n == 1)
	{ 
		return 2;
	}
	else
	{
		return fib(n - 1) + fib(n - 2);
	}
}
int main() {
	fib(8);
	printf("%d ",cnt);
	return 0;
}

我的思路是这样
f(2) = f(1)+f(0) 这里的cnt = 3 (因为f(2)的时候也会让cnt加加一次)
f(3) = f(2)+f(1) 这里的cnt=5
f(4)=f(3)+f(2) cnt = 9
f(5)=f(4)+f(3) cnt = 15
f(6) =f(5)+f(4) cnt = 25
f(7) = f(6)+f(5) cnt = 41
f(8) =f(6)+(f7) cnt = 25 +41 + 1 = 67
这是运行结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用 C 语言实现的克鲁斯卡尔算法最小生成树的代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_EDGE_NUM 100 // 边的最大数量 #define MAX_VERTEX_NUM 100 // 顶点的最大数量 typedef struct { int u, v; // 边的两个端点 int w; // 边的权值 } edge; int cmp(const void *a, const void *b) { return ((edge *)a)->w - ((edge *)b)->w; } int find(int x, int *p) { if (p[x] != x) { p[x] = find(p[x], p); } return p[x]; } void merge(int x, int y, int *p) { int px = find(x, p); int py = find(y, p); if (px != py) { p[px] = py; } } void kruskal(edge *edges, int n, int m) { int p[MAX_VERTEX_NUM], i, cnt = 0, sum = 0; for (i = 0; i < n; i++) { p[i] = i; } qsort(edges, m, sizeof(edge), cmp); for (i = 0; i < m && cnt < n - 1; i++) { int u = edges[i].u; int v = edges[i].v; if (find(u, p) != find(v, p)) { merge(u, v, p); cnt++; sum += edges[i].w; } } printf("最小生成树的权值为 %d\n", sum); } int main() { int n, m, i; edge edges[MAX_EDGE_NUM]; printf("请输入顶点数量和边数量:"); scanf("%d %d", &n, &m); printf("请输入每条边的起点、终点和权值:\n"); for (i = 0; i < m; i++) { scanf("%d %d %d", &edges[i].u, &edges[i].v, &edges[i].w); } kruskal(edges, n, m); return 0; } ``` 在这个程序中,我们使用了结构体来表示一条边,包括其起点、终点和权值。我们还使用了并查集来判断加入一条边是否会形成环,以及将两个连通块合并。在最后的输出中,我们输出了最小生成树的权值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值