一:函数调用时的栈
程序中的“函数调用栈”是栈数据结构的一种应用,类似于顺序栈,因为有大小
出栈和入栈已经由编译器封装好了,所以我们没看见
函数调用栈一般是从高地址向低地址增长
栈底为内存的高地址处
栈顶为内存的低地址处
函数调用栈中存储的数据为活动记录
活动记录:
函数参数,函数返回地址
局部变量
函数调用上下文
栈溢出常由于递归过深或者局部数组过大造成
二:递归的数学思想
递归是一种数学上分而自治的思想
递归将大型复杂问题转化为与原问题相同但规模较小的问题进行处理
递归需要边界条件
当边界条件不满足时,递归继续进行
当边界条件满足时,递归停止
三:斐波拉契数列递归解法
F0=0;
F1=1;
Fn=Fn-1+Fn-2;(n>=2)
四:strlen的递归实现
注;必要时包含assert.h
unsigned int my_strlen(char *str)
{
return ((assert(str!=NULL)),(*str!='\0'?1+my_strlen(str+1):0));
}
五:汉诺塔问题
六:全排列递归解法
七:回溯算法
回溯算法思想:
从问题的某一状态出发,搜索可以到达的所有状态
当某个状态到达后,可向前回退,并搜索其它可到达状态
当所有状态到达后,回溯算法结束
程序设计中可以利用函数的活动对象保存回溯算法的状态数据,因此可以利用递归完成回溯算法
回溯算法是递归应用的重要场合
利用函数调用的活动对象可以保存回溯算法中重要的信息
八皇后问题
国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上
算法思路
1初始化:i=1
2初始化:j=1
3从第i行开始,恢复j的当前值,判断第j个位置
a:位置j可放入皇后:标记位置(i,j),i++,转步骤
b:位置j不可放入皇后:j++,转步骤a
c:当j>8时,i--,转步骤3
4结束
第8行有位置可放入皇后