- 注意递归是从最上面的栈逐层返回,谁调用就返回给谁。
- 如果传递的是引用类型,会共享引用类型的数据
- 递归要有退出递归的条件。
- 汉诺塔:有一个盘的情况,直接从A->C,其他都看成底下一个盘算一个,上面所有盘算一个共两个盘的情况A->B,A->C,B->C.即借用中间的柱从开始柱转移到目标柱。
- 以3个盘为例,经过一番操作中间(B)有两个小盘,最大的盘已经放在目标柱(C)上了,此时最大盘已经好了,不管他了,剩下两个小盘的开始柱为B,借用中间柱A到目标柱C上。
- 回溯的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。为深度优先搜索。
- 典型:如迷宫问题,前进一个改变状态,如果不满足条件要回到上一个,还要把状态变回原来的样子
public void funtion(参数) {
if (终止条件) {
存放结果;
return;
}
for (选择:本层集合中元素) {
改变节点状态;
function(路径,选择列表); // 递归
回溯,撤销节点状态的改变
}
}