//函数与递归
//#define _CRT_SECURE_NO_WARNINGS 1
//#include
//#include
//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环境编译