递归问题经常的想法是转化为子问题,即拿出一个最简单的情况,看剩下n-1的情况如何变化。如求二叉树的叶子,转为左子树+右子树
1. 汉诺塔 及逆序输出
1. 汉诺塔 及逆序输出
2. 全排列 每次选取后面的一位与自己交换,自己也传递下去
c(n,m)=c(n-1,m-1)+c(n-1,m)
任意选择n中的某个备选元素为特殊元素,从n中选m个元素可以由此特殊元素的分成两类情况,即m个被选择元素包含了特殊元素和m个
被选择 元素不包含该特殊元素
3. 分苹果
将m个放入n-1个中,m-n放入n个中(一次情况遍历)
4. 幂方分解
5. 借助栈实现非递归
6. 一次情况遍历,回溯法
7. 用递归避免手写多层循环,可变循环次数
8. 立足现在,把问题分解,明确最简单的情况,eg:概率问题,(蓝桥杯)
车票问题,一直从(m-1,n)与(m,n-1)再添加一个与(m,n)是否相同来思考。但是递归问题是 明确把问题分为简易状态(首位0/1)最简单的情况与后面的合并与从后面推出相对应
明确每个递归点的状态描述为 什么,最好状态为此点
实际在于压栈,出栈,访问几个环节的条件与配合
递归分为前置与后置,以操作,递归的先后区分。划分子问题并利用返回值
这个原来是斐波那契数数列,的迭代。
程序设计在线导引
核心思想是将问题规模变小(1. 记录走的路程,利用depth;2. 利用返回值,归结为子部分与本结果的整合)
return max(h1,h2)+1; return f(n-1)+f(n-2)+1;// 对可能的情况做一次枚举