C语言学习笔记——函数和递归章节

学习小结

c语言函数和递归学习笔记汇总

//函数与递归
//#define _CRT_SECURE_NO_WARNINGS 1
//#include<stdio.h>
//#include <string.h>

//int Add(int x,int y)//定义Add函数
//{
//	int z = 0;
//	z = x + y;
//	return z;
//}
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int sum = Add(a, b);//Add函数需要自己定义
//	printf("%d\n", sum);
//	return 0;
//}

//strcpy字符串拷贝
//int main()
//{
//	//strlen——string length——字符串长度有关
//	//strcpy——string copy——字符串拷贝
//	char arr1[] = "bit";
//	char arr2[20] = "########";
//	strcpy(arr2, arr1);//将arr1的内容拷贝到arr2
//	printf("%s\n", arr2);
//	return 0;
//}

//memset
//memory - 内存 set - 设置
//int main()
//{
//	char arr[] = "hello world";
//	memset(arr, '*', 5);
//	printf("%s\n", arr);
//	return 0;
//}

//自定义函数
//写一个函数可以找出两个整数中的最大值
//int Add(int x, int y)
//{
//	if (x > y)
//	{
//		return x;
//	}
//	if (x < y)
//	{
//		return y;
//	}
//}
//int main()
//{
//	int a = 30;
//	int b = 20;
//	int sum = Add(a, b);//比较两个数的最大值函数
//	printf("最大值为:%d", sum);
//	return 0;
//}

//写一个函数交换两个整形变量的内容
//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("a=%d b=%d\n", a, b);//交换前
//	int tmp = 0;
//	//开始交换
//	tmp = a;
//	a = b;
//	b = tmp;
//	//结束交换
//	printf("a=%d b=%d\n", a, b);//交换后
//	return 0;
//}

//此代码有问题
//void Swap1(int x, int y) //vodi的意思是这个自定义函数没属性,没返回值
//{
//	int tmp = 0;
//	tmp = x;
//	x = y;
//	y = tmp;
//}
//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("a=%d b=%d\n", a, b);//交换前
//	int tmp = 0;
//	Swap1(a,b);//自定义函数 交换的意思
//	//开始交换
//	//tmp = a;
//	//a = b;
//	//b = tmp;
//	//结束交换
//	printf("a=%d b=%d\n", a, b);//交换后
//	return 0;
//}
//修改后
//void Swap2(int* x, int* y) //*x *y (指针)用于接受a与b的地址
//{
//	int tmp = 0;
//	tmp = *x;
//	*x = *y;
//	*y = tmp;
//}
//int main()
//{
//	int a = 10;
//	int b = 20;
//	printf("a=%d b=%d\n", a, b);//交换前
//	int tmp = 0;
// //调用Swap2函数
//	Swap2(&a,&b);//自定义函数 交换的意思
//	//开始交换
//	//tmp = a;
//	//a = b;
//	//b = tmp;
//	//结束交换
//	printf("a=%d b=%d\n", a, b);//交换后
//	return 0;
//}
//void swap(int* x, int* y)
//{
//	int tmp = 0;
//	tmp = *y;
//	*y = *x;
//	*x = tmp;
//}
//int main()
//{
//	int a = 20;
//	int b = 10;
//	printf("a=%d b=%d\n", a, b);
//	//调用swap函数
//	swap(&a, &b);
//	printf("a=%d b=%d\n", a, b);
//	return 0;
//}

//写一个函数判断一个数是不是素数
//是素数返回1,不是返回0
//int Add(int x)
//{
//	int i = 0;
//	//产生2到x-1的数进行试除法
//	for (i = 2; i < x; i++)
//	{
//		if (x % i == 0)
//			break;
//	}
//	if (x == i)
//		return 1;
//}
//int main()
//{
//	int a = 0;
//	scanf("%d", &a);
// //	if (Add(a) == 1)//需要自己定义的函数
//	{
//		printf("是素数%d\n", a);
//	}
//	else
//		printf("不是素数%d\n", a);
//	return 0;
//}

//写一个函数判断一年是否为闰年
//闰年判断条件:
//(1)十年一闰百年不闰:即如果year能够被4整除,但是不能被100整除,则year是闰年。
//(2)每四百年再一闰:如果year能够被400整除,则year是闰年
//int Add(int x)
//{
//	if (((x % 4 == 0) && (x % 100 != 0)) || (x % 400 == 0))
//	{
//		return 1;
//	}
//	else
//		return 0;
//}
//int main()
//{
//	int a = 0;
//	scanf("%d", &a);
//	if (Add(a) == 1)//Add需要自己定义的函数
//	{
//		printf("是闰年\n");
//	}
//	else
//		printf("不是闰年\n");
//	return 0;
//}

//写一个函数,实现一个整形有序数组的二分查找
//找到了返回下标,找不到返回-1
//                  本质上x这个数组是个指针
//int binary_search(int x[], int y,int sz)
//{
//	int left = 0;//坐小标
//	int right = sz - 1;//右下标 元素个数比下标少一
//	while (left <= right)
//	{
//		//二分查找算法
//		int mid = (left + right) / 2;//中间元素的下标
//		if (y < x[mid])
//		{
//			right = mid - 1;
//		}
//		else if (x[mid] < y)
//		{
//			left = mid + 1;
//		}
//		else
//		{
//			return mid;
//		}
//	}
//	return -1;
//}
//int main()
//{
//	int arr[]={ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
//	int k = 0;
//	int sz = sizeof(arr) / sizeof(arr[0]);//数组中的元素个数
//	scanf("%d", &k);
//                         传递过去是数组arr首地址的元素
//	int ret = binary_search(arr, k,sz);
//	if (ret == -1)
//		printf("找不到\n");
//	else
//		printf("找到了,下标是%d\n", ret);
//	return 0;
//}

//写一个函数,每次调用这个函数,num的值就会加1
//因为是通过函数内部对函数外部进行修改,所以需要用到传地址调用
//因为不需要返回值,所以用void(无属性)
//void Add(int* x)
//{
//	(*x)++;
//}
//int main()
//{
//	int num = 0;
//	Add(&num);
//	printf("num=%d\n", num);//1
//	Add(&num);
//	printf("num=%d\n", num);//2
//	Add(&num);
//	printf("num=%d\n", num);//3
//	return 0;
//}

//函数的声明与定义
//写一个加法函数
//函数的声明
//int Add(int x, int y);
//
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int sum = 0;
//	//使用函数
//	sum = Add(a,b);//自定义函数
//	printf("%d\n", sum);
//	return 0;
//}
函数的定义
//int Add(int x, int y)//如果把定义放在使用后面则会报警告(先声明后使用) warning C4013: “Add”未定义
//{
//	int z = x + y;
//	return z;
//注意:先声明后使用,不然会警告

//#include "fundelib.h"
//int main()
//{
//	int a = 10;
//	int b = 20;
//	int sum = 0;
//	//使用函数
//	sum = Add(a, b);//自定义函数
//	printf("%d\n", sum);
//	return 0;
//}

//函数的递归
//一个函数在它的函数体内调用它自身称为递归调用,这种函数称为递归函数。
//执行递归函数将反复调用其自身,每调用一次就进入新的一层,当最内层的函数执行完毕后,再一层一层地由里到外退出。

//简易的递归函数的方式
//int main()
//{
//	printf("hehe\n");
//	main();
//	return 0;
//}
//异常: 0xC00000FD: Stack overflow 意思是栈溢出了

//函数递归联系
//接受一个整形值(无符号),按照顺序打印它的每一位。例如输入:1234,输出1 2 3 4
//void print(int x)
//{
//	if (x > 9)
//	{
//		print(x / 10);
//	}
//	printf("%d ", x % 10);
//}
//int main()
//{
//	 unsigned int num = 0;//因为是无符号,所以加unsigned
//	scanf("%d", &num);
//	print(num);
//	return 0;
//}

//编写函数不允许创建临时变量,求字符串的长度
//int my_strlen(char* str)
//{
//	int count=0;
//	while (*str != '\0')
//	{
//		count++;
//		str++;
//	}
//	return count;
//}

//不用临时变量创建函数
//int my_strlen(char* str)
//{
//	if (*str != '\0')
//		return 1 + my_strlen(str + 1);//str加1 意思是str第一个元素地址加+1变第二个元素的地址
//	else
//		return 0;
//}
//int main()
//{
//	char arr[] = "bit";
//	//int len=strlen(arr); //求字符串长度函数
//	//模拟实现,自己创造一个函数
//	int len = my_strlen(arr);//arr是数组,数组传参,穿过去的不是整个数组,而是第一个元素的地址
//	printf("%d\n", len);
//}

//递归与迭代
//求n的阶乘
//int Fac1(int n)//非递归的方式
//{
//	int i = 1;
//	int ret = 1;
//	for (i = 1; i <= n; i++)
//	{
//		ret = ret * i;
//	}
//	return ret;
//}
//int Fac2(int n)//递归的方式
//{
//	if (n <= 1)
//		return 1;
//	else
//		return n * Fac2(n - 1);
//}
//int main()
//{
//	//求n的阶乘
//	int n = 0;
//	int ret = 0;
//	scanf("%d", &n);
//	ret = Fac2(n);//循环的方式
//	printf("%d\n", ret);
//	return 0;
//}

//斐波那契数列
//1 1 2 3 5 8 13 21 34 55......
//前两个数之和等于第三个数
//以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)

//描述第n个斐波那契数列的函数
//int Fib(int n)//递归的方式
//{
//	if (n <= 2)
//		return 1;
//	else
//		return Fib(n - 1) + Fib(n - 2);
//}
//int Fib(int n)//迭代循环的方式
//{
//	int a = 1;
//	int b = 1;
//	int c = 1;
//	while (n > 2)
//	{
//		c = a + b;
//		a = b;
//		b = c;
//		n--;
//	}
//	return c;
//}
//int main()
//{
//	int n = 0;
//	int ret = 0;//第n个斐波那契数列的存放地
//	scanf("%d", &n);
//	//TDD——测试驱动开发 先去想怎么用自己定义的函数,然后再去实现这个函数
//	ret = Fib(n);
//	printf("ret=%d\n", ret);
//	return 0;
//}

//n的阶乘
//int Add1(int n)
//{
//	if (n <= 1)
//		return 1;
//	else
//		return n * Add1(n - 1);
//
//}
//int main()
//{
//	int n = 0;
//	int ret = 0;
//	scanf("%d", &n);
//	ret = Add1(n);
//	printf("%d\n", ret);
//	return 0;
//}

//int Fab(int n)
//{
//	//if (n <= 2)//递归的方式
//	//	return 1;
//	//else
//	//	return Fab(n - 1) + Fab(n - 2);
//	//迭代的方式
//	int a = 1;//斐波那契数列的第一个数
//	int b = 1;//斐波那契数列的第2个数
//	int c = 1;//前两个斐波那契数列的和
//	while (n > 2)
//	{
//		c = a + b;
//		a = b;
//		b = c;
//		n--;
//	}
//	return c;
//}
//int main()
//{
//	int n = 0;
//	int ret = 0;
//	scanf("%d", &n);
//	ret = Fab(n);
//	printf("%d\n", ret);
//	return 0;
//}

//函数递归的几个经典题目
//1、汉诺塔问题
//2、青蛙跳台阶问题
//书籍推荐《剑指office》

以上代码均在vs2022环境编译

猜你喜欢

转载自blog.csdn.net/qq_72935001/article/details/126023895