递归
递归:函数(方法直接或间接调用自身)。
是一种常用的编程技巧,暴力法。
函数的递归调用过程
递归的基本思想
递归经典问题
斐波那契数列
当然,斐波那契数列也可以不使用递归,利用斐波那契数列前后项之间的关系求解第n项的值(详情可见我的文章 数据结构与算法学习(第一天)),从而实现优化。
爬楼梯(台阶)
汉诺塔问题
汉诺塔问题的实现代码
我觉得汉诺塔问题最难理解的是它的实现代码。
汉诺塔问题实现代码:
首先hanoi函数就是将n个盘子从p1移动到p3(借助p2)
然后根据思路写具体代码,如第一步就是hanoi(n-1,a,c,b),意思就是将n-1个盘子从A移动到B(借助C)。
最终可得到如下的实现代码(可以用n=2的简单情况来操作一下,加深理解,如果还是不懂,建议找视频看看,get到点自然就懂了)
递归转非递归
尾递归
尾递归可以用来节省栈空间,因为它只需要记录最后一次函数调用的信息就能输出正确结果
下面这个链接的文章,我觉得把尾递归的好处讲得很透彻。
回溯
八皇后问题
八皇后问题的解决思路
八皇后问题使用回溯法(递归实现),逐行摆放皇后,并通过检查待摆放位置的列上是否有皇后,还有检查该位置的左上对角线、右上对角线是否有皇后,达到剪枝的效果
对角线的判断方式
判断是否是对角线可以用索引的方法