Recursive
知识是相互关联的。
递归是一种形式或者叫做机制。
每次调用都伴随着参数的改变,参数的取值与子问题相对应,这样,递归就可以用来暴力地枚举所有可能的情况的(也就是搜索?)。
可以用(线性递归、二分递归、多分支递归)不同的递归形式,实现(遍历、分治)等算法策略。
分治——凡治众如治寡,将原问题分解成(规模更小的)子问题,用递归机制求解。
递归基:递归的终止条件,平凡情况。
线性递归:每一递归实例对自身至多调用一次,递归实例间是线性的次序关系。
线性递归模式往往对应减而治之的算法策略,递归每深入一层,待求解的问题的规模就缩减一个常数,直至最终蜕化成一个简单的小问题。
多向递归:每个递归实例可能有多个递归的方向,但只能选择其中一个,各层次上的递归实例仍是线性次序关系,还属于线性递归模型。
多路递归:每一实例做多次递归,不局限于是对原问题的划分。递归形式的线段树写法就是为了满足需要,采用递归的形式。(结合实际需要考虑吧)
按照调用关系和次序,形成层次结构。
递归树:代填
优化策略:记忆或者动规。
---------------------------
递归:定义一个流程或过程。
每次调用会产生一个伴随池,记录过程中的临时变量,同时系统栈记录现场(子过程调用前,原过程的参数和行号(调用子过程时原过程的进程位置))
栈:先进后出
栈:保存所有信息(包括行号)保存现场,还原现场,顺序结构,一行一行跑。从哪里调用之后返回哪里,接着向下运行。
流程,样本量处理流程是一致的
调用子过程,只是样本域不一样,共享流程
basecase:递归终止条件,不需要再划分子问题
2020/01/28
问题本身可能就是递归定义的---观察问题的形式,是否就是递归定义的(郭玮讲递归用处那好像提到过)。
递归与分治,递归来搜索也可以理解为递归来枚举---由递归求全排列引起的思考。
2020/01/14
递归用来搜索;递归用来分治---(基于快速幂的思考,子问题的处理);递和归;快速幂的递归写法,快速幂的迭代写法。
2019/01/04
由郭神程序设计与算法课二求阶乘中关于递归调用压栈过程图示分析引发的思考:Link
1.递归调用F(n),接下来就是在F(n)里跑,栈顶记录的形参是n,返回地址是n-1的。
2.调用一个函数,栈就往上长一层,形参记录的是这层,返回地址记录的是上一层的信息
3.返回就是返回到上一层,返回上一层也就意味着栈退了一层(一过程的两个角度描述)。
ref:《程序员的数学》
2018/12/2
递归,上下层间的联系(递推关系),找出递推结构(递推关系)
先考虑小的问题,从中找出重复相似的规律(模拟一下,归纳)
ps:
从整体问题中隐去部分问题
判断剩余问题是否和整体问题是同类问题
即
从n层的整体问题中隐去部分问题
判断剩余部分是否是n-1层的问题
恩...n层怎么由前面的n-x层组成,还可对n层的组成进行分类(组合数,帕斯卡三角组合数)