1.*****函数嵌套调用
递归
-- 自己调用自己
实现思想:
要素:
1.递推关系 //问题n和问题n-1
2.递推结束的条件
递归也是一种特殊的循环
递归的过程,实际上是函数的调用,而函数调用需要 使用 栈空间(内存空间)
2.*****栈:
1. 是一种数据结构 FILO (First In Last Out)
2. 内存上的一块空间
3. 大小肯定是有限的
4. 可以存放函数调用数据
5. 局部变量(自动变量)
自动申请,自动释放
32位 --- 4G内存空间
32位 地址总线 32位
2^32 => 2^10 * 2^10 * 2^10 *2^2
1024 1024 1024 4
1K 1M 1G
3.*****堆:
1. 空间很大
2. 手动申请,手动释放 //后面讲
4.*****字符串常量区:
"hello" //字符串常量
不能被修改 - 只读
全局区(静态区)
全局变量的
代码区
存放代码的
程序 = 数据 + 代码
5.*****汉诺塔:
递归的思路
问题n
|--问题n-1 与 n
|--问题n-2
|---
...结束条件
hanoi(64)
|---hanoi(63)
|---hanoi(62)
|---
...
hanoi(1)
思路:
//hanoi(n)
//n = 3
1. 将n-1格盘子, 从 A 起始柱 移动 B 辅助柱子
2. 将第n格盘子,从A移动到C
3. 再将n-1盘子,从B 移动到 C
//n = n-1 => 2
1. 将n-1格盘子, 从 A(起始柱子) 移动 C 辅助柱子
2. 将第n格盘子,从A (起始柱子) 移动到B (目标柱子)
3. 再将n-1盘子,从B 移动到 C
6.*****数组作为函数参数
函数参数:
形参变量
实际参数
int a[3] = {1,2,3};
//情况1
数组元素作为函数参数
注意:
//1.数组元素的类型 是否 与形参类型一致
//情况2
想把整个数组传入到函数中
//形参 和 实参 规则
1.个数相同
2.类型匹配
3.一一对应
数组名 能代表 整个数组 //给实参时,给定 数组名
int a[10]; //a 数据类型 int[10]
注意:
1.数组 作为函数 参数 ,
形式上,保持一致,被调函数中 就可以 访问到主调函数中 数组的数据
一维整型数组作为函数参数
形参 写成数组的形式 同时需要 一个接受数组长度的形参
实参 传数组名,传数组长度
2.数组作为函数参数,
因为传的是数组名,而数组名是数组首元素的地址,所以相当于将数组空间的地址传给了被调函数,
而被调函数,通过数组下标运算,可以直接访问到了主调函数中对应数组空间的数据。
所以,数组传参的这种方式,可以实现,被调函数修改主调函数中的数据
总练习题:
1.
2.
3.
4.