1、递归的思想与应用
函数调用过程回顾
-程序运行后有—个特殊的内存区供函数调用使用
用于保存函数中的实参,局部变量,临时变量,等
从起始地址开始往—个方向增长(如:高地址.+低地址)
有—个专用”指针”标识当前已使用内存的“顶部'
这片特殊的内存区域符合了数据结构的栈特性,叫栈区
程序中的栈区:一段特殊的专用内存区
C语言课程关于此图已稍微介绍
实例分析:逆序打印单链表中的偶数结点
2、编程实验
函数调用栈分析 void r_print_even(Node* list)
#include <iostream> using namespace std; struct Node { int value; Node* next; }; Node* create_list(int v,int len) { Node* ret = NULL; Node* slider = NULL; for(int i=0;i<len;i++) { Node* n = new Node(); n->value = v++; n->next = NULL; if(slider == NULL) { slider = n; ret = n; } else { slider->next = n; slider = n; } } return ret; } void destory_list(Node* list) { while(list) { Node* del = list; list = list->next; delete del; } } void print_list(Node* list) { while(list) { cout<<list->value<<"->"; list = list->next; } cout<<"NULL"<<endl; } void r_print_even(Node* list) { if(list != NULL) { r_print_even(list->next); //除第一个结点外的结点(后续子表) if((list->value) % 2 == 0) { cout<<list->value<<endl; } } } int main() { Node* list = create_list(2,5); print_list(list); r_print_even(list); destory_list(list); return 0; }
八皇后问题
在—个8x8的国际象棋棋盘上,有8个皇后,写个皇后占
一格;要求皇后间不会出现相互“攻击'的现象(不能
有两个皇后处在同—行、同—列或同—对角线上)。
关键数据结构定义:
-棋盘:二维数组(10 * 10)
0表示位置为空,1表示皇后,2表示边界
-位置:struct Pos;
关键数据结构定义:
- 方向:
水平: (-1, 0), (1, 0)
垂直: (0, -1), (0, 1)
对角线: (-1, 1), (-1, -1), (1, -1), (1, 1)
算法思路
1. 初始化: j = 1
2. 初始化: i = 1
3. 从第j行开始,恢复i的有效值(通过函数调用栈进行回溯 ),判断第i个位置
a. 位置 i 可放入皇后:标记位置( i , j ) , j++, 转步骤2
b. 位置 i 不可放入皇后: i++, 转步骤a
c. 当i > 8时,j--,转步骤3
- 结束:
第8行有位置可放入皇后
3、编程实验
八皇后问题的递归解法 class QueueSolution;coding...
4、小结
程序运行后的栈存储区专供函数调用使用
栈存储区用于保存实参,局部变量,临时变量,等
利用栈存储区能够方便的实现回溯算法
八皇后问题是栈回溯的经典应用