c语言学习小结_04

一、之前在上一篇里,用递归实现求第n个斐波那契数字的时候,实际上效率是很低的。因为进行了很多重复的计算,如下如所示:
在这里插入图片描述
在求第6个数字的时候,进行了很多重复的计算,

int count = 0;
//用递归求第n个斐波那契数字
int Fib(int n){
	if (1 == n || 2 == n){
		return 1;
	}
	if (n == 3){
		count++;
	}
	return Fib(n - 1) + Fib(n - 2);
}
int main(){
	int ret= Fib(40);
	printf("%d\n", ret);
	printf("调用Fib(3) %d 次\n", count);
	system("pause");
	return 0;
}

在这里插入图片描述
仅仅计算Fib(40)就计算了Fib(3)这么多次,那么为什么调用次数多就会如此的低效呢,因为调用函数是有成本的,因为会不断形成和释放栈帧,体现在时间和空间两个角度。那么如何改进呢?可以将递归改为非递归,用迭代的方式。

int fib_1(int n)
{
	int first = 1;
	int second = 1;
	int third = 1;
	while (n>2){
		third = first + second;
		first = second;
		second = third;
		n--;
	}
	return third;
}
int main(){

	int ret = fib_1(40);
	printf("%d\n", ret);
	

	system("pause");
	return 0;
}

用这种迭代的方式结果是秒出。
二、
1、数组
使用数组时候的注意事项
1)int arr[25];
数组的创建,[] 中要给一个常量才可以,不能使用变量。
2)数组可以被整体初始化,但是不能被整体赋值,
3)数组在内存中的存储
数组空间在内存中是整体开辟整体释放的,必须把数组看成一整体,下标从零开始,地址由低到高,内存寻址的基本单位是字节哦,数组在内存中的一定是连续存放的(线性存储);写一段代码看看数组在元素的地址:

int main(){
	int arr[10] = { 0 };
	int arrsize = sizeof(arr) / sizeof(arr[0]);//此时数组名,sizeof(arr)单独使用 \
	代表的是整个数组
	for (int i = 0; i < arrsize; i++){
		printf("&arr[%d] = %p\n", i, &arr[i]);
	}
	system("pause");
	return 0;
}

在这里插入图片描述
可以看到数组元素地址由高到低,而且是连续的,因为每个int类型的大小为4个字节。
2、扩展到二维数组
二维数组可以看做一维数组,只不过数组中存放的元素是一维数组,3维4维也是如此,类比以为数组中存放的比如是int类型的数字,现在是数组类型而已,以后还会由结构体类型,类,等。
注意事项:二维或者多维数组初始化的时候,只有第一维的长度可以省略。
3、数组作为函数的参数
数组作为函数的参数传递的时候发生降维,降维成指向其内部元素的指针,而且数组作为参数进行传递时候,要把数组的长度也传进去。
查找一个无序数组中的元素下标
第一步:先把数组排序
第二步:二分查找数组的下标
代码如下:

//打印数组元素
void PrintArr(int arr[], int arrsize){
	for (int i = 0; i < arrsize; i++){
		printf("%d\n", *(arr + i));
		//printf("%d\n", arr[i]);
	}
}
//冒泡排序
void BubbleSort(int arr[], int arrsize){
	int flag = 0;
	for (int i = 0; i < arrsize-1; i++){
		for (int j = 0; j < arrsize - 1 - i; j++){
			if (arr[j]>arr[j + 1]){
				int temp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = temp;
				flag = 1;
			}
		}
		if (flag){
			break;
		}
	}
}
//二分查找
int BinSearch(int arr[], int arrsize, int num){
	int left = 0;
	int right = arrsize - 1;//[]
	int mid = 0;
	while (left <= right){
		mid = left + (right - left) / 2;//避免溢出
		if (num > arr[mid]){
			left = mid + 1;
		}
		else if (num <arr[mid]){
			right = mid - 1;
		}
		else{
			return mid;
		}
	}
	if (left > right){
		printf("没有这个元素~~\n");
	}

}
int main(){
	int arr[] = { 0,1,2,3,4,99,66,77,88,111,222,555,666 };
	int arrsize = sizeof(arr) / sizeof(arr[0]);

	printf("排序前:\n");

	PrintArr(arr, arrsize);

	BubbleSort(arr, arrsize);

	printf("排序后:\n");

	PrintArr(arr, arrsize);

	int index  = BinSearch(arr, arrsize, 66);
	printf("要查找元素的下标为 %d:\n", index);

	system("pause");
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值