学习内容
1.函数的声明与调用
2.函数的递归与迭代
练习题
代码笔记
//函数的声明及定义
//函数声明:
//1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数声明决定不了
//2.函数的声明出现在函数的使用之前。要满足先声明后使用
//3.函数的声明通常在头文件
// 函数的定义
//先定义方便与后面调用 否则要先在主函数前声明
//int Add(int x, int y);//声明至少要知道函数名以及返回值类型
//int main()
//{
// int a = 0;
// int b = 0;
// scanf("%d %d", &a, &b);
// int sum = Add(a, b);
// printf("%d\n", sum);
// return 0;
//}
//
//int Add(int x, int y)
//{
// return x + y;
//}
//
//
// 函数递归
//1.程序调用自己的编程技巧称为递归 一个过程或者函数在其定义或说明中有直接或间接调用自身的一种方法
// 通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解 少量代码描述
// 所需多次重复计算减少程序的代码量
// 思考方式为:把大事化小
//练习1
//接受一个整形值(无符号),按照顺序打印它的每一位。 例如: 输入:1234 输出:1 2 3 4
//%d 打印有符号的整数(会有正负数)
//%u 打印无符号的整数
//int main()
//{
// unsigned int num = 0;
// scanf("%u", &num);
// while (num)
// {
// printf("%u", num % 10);
// num = num / 10;
// }
// return 0;
//}
//递归的实现
//printf(1234)
//printf(123) 4
//printf(12) 3 4
//printf(1) 2 3 4
//1 2 3 4
//void print(unsigned int n)
//{
// if (n > 9)//如果没有该条件 递归无法结束 死递归 栈溢出
// {
// print(n / 10);
// }
// printf("%d ", n % 10);
//}
//int main()
//{
// unsigned int num = 0;
// scanf("%u", &num);
// print(num);//接受一个整形值(无符号),按照顺序打印它的每一位
// return 0;
//}
//栈区 局部变量 函数形参 每次函数的调用会在栈区申请空间
//堆区
//静态区
//递归的必要条件
//1.存在限制条件,当满足这个限制条件时候,递归便不再继续
//2.每次递归调用之后越来越接近这个限制条件
//练习2
//编写函数不允许创建临时变量,求字符串长度。
//模拟实现strlen
临时变量求解
//int my_strlen(char*str)//参数写成指针的形式
//{
// int count = 0;//计数(临时变量)
// while (*str != '\0')
// {
// count++;
// str++;
// }
// return count;
//}
//递归方式求解
//my_strlen("abc")
//1+my_strlen("ab")
//1+1+my_strlen("a")
//1+1+1+my_strlen(" ")
//int my_strlen(char* str)
//{
// if(*str != '\0')
// {
// return 1 + my_strlen(str + 1);
// }
// else
// {
// return 0;
// }
//}
//
//int main()
//{
// char arr[] = "abc";//[a b c \0]
// int len = my_strlen("arr");//传递了a的地址
// printf("%d",len);
// return 0;
//}
//练习3
//函数的迭代(循环是一种迭代,迭代不一定为循环)
//求n!
//int fac(int n)
//{
// /*if (n <= 1)
// return 1;
// else
// return n * fac(n - 1);*/ //if 语句
//
// /*int i = 0;
// int ret = 1;
// for (int i = 1; i <= n; i++)
// {
// ret *= i;
// }
// return ret;*/ //迭代的方式(非递归)
//}
//
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// int ret = fac(n);
// printf("ret = %d\n",ret);
// return 0;
//}
//练习4
//求第n个斐波那契数列
//
//int Fib(int n)
//{
// int a = 1;
// int b = 1;
// int i = 0;
// for (i = 0; i <= n - 3; i++)
// {
// int c = a + b;
// a = b;
// b = c;
// }
// return b;
//}//非递归
//
//
int Fib(int n)
{
if (n <= 2)
{
return 1;
}
else
{
return Fib(n - 1) + Fib(n - 2);
}
}//递归 效率低
40
39 38
38 37 37 36
…………………
…………………
重复计算过多
//
//int main()
//{
// int n = 0;
// scanf("%d", &n);
// int num = Fib(n);
// printf("num=%d", num);
// return 0;
//}
//是否使用递归需要权衡,简单,少出错为标准
//如何解决栈溢出的问题1.将递归改为非递归 2.使用静态变量 代替 局部变量 减少使用栈区空间 平衡存储
感悟思考
方法众多 灵活思考 效率至上 加油 ^ - ^