递归与回溯思想的应用——以八皇后问题为例
1.递归与回溯 1.1递归 乍一听很高深,其实理解起来很轻松,但是面对问题时如何动手编写递归程序却十分棘手! 递归程序的流程图很清晰,非常直观。所谓递归,简单点来说,就是一个函数直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解。 递归与循环有本质区别:简单来说,循环是有去无回,而递归则是有去有回(因为存在终止条件)。 递归与栈的关系:常常听到 “递归的过程就是出入栈的过程”,这句话怎么理解?我们以阶乘代码为例,取 n=3,则过程如下: 第 1~4 步,都是入栈过程,Factorial(3)调用了Factorial(2),Factorial(2)又接着调用Factorial(1),直到Factorial(0); 第 5 步,因 0 是递归结束条件,故不再入栈,此时栈高度为 4,即为我们平时所说的递归深度; 第 6~9 步,Factorial(0)做完,出栈,而Factorial(0)做完意味着Factorial(1)也做完,同样进行出栈,重复下去,直到所有的都出栈完毕,递归结束。 每一个递归程序都可以把它改写为非递归版本。我们只需利用栈,通过入栈和出栈两个操作就可以模拟递归的过程,二叉树的遍历无疑是这方面的代表。但是并不是每个递归程序都是那么容易被改写为非递归的。某些递归程序比较复杂,其入栈和出栈非常繁琐,给编码带来了很大难度