一、递归
1 递归的定义
所谓递归就是一个函数或过程可以直接或间接的调用自己。我们大家都熟悉一个民间故事:从前有一座山,山上有一座庙,庙里有一个老和尚正在给小和尚讲故事,故事里说,从前有一座山,山上有一座庙 ,庙里有一个老和尚正在给小和尚讲故事,故事里说…。像这种形式,我们就可以称之为递归的一种形象描述,老和尚什么时候不向下讲了,故事才会往回返,最终才会结束。
再如:前面多次提到的求n阶乘的问题,因此,求n阶乘的问题转化成了求n*(n-1)!的问题,而求n-1阶乘的问题又与求n阶乘的方法相同,只不过是求阶乘的对象的值减去了1,当n的值递减到0时,n!=1,从而结束以上过程,求得n阶乘的解。
也就是说,求解n阶乘的过程可以用以下递归方式来表示:
在这里,为了定义n!,就必须先定义(n-1)!,为了定义(n-1)!,又必须先定义(n-2)!。。。。。。,上述这种用自身的简单情况来定义自己的方式成为递归定义。
一个递归定义必须是有确切含义的,也就是说,必须一步比一步简单,最后是有终结的,决不允许无限循环下去。上面的例子中,当N=0时定义一个数1,是最简单的情况,称为递归的边界,它本身不在使用递归定义。每一递归都有其边界条件,递归的边界条件是从自身出发达到边界条件。
2 递归的调用
在程序中,子程序可以直接自己调用自己或间接调用自己,则将这种调用形式称之为递归调用。
递归调用时必须符合以下三个条件:
(1)可将一个问题转化为一个新的问题,而新问题的解决方法仍与原问题的解决方法相同,只不过所处理的对象有所不同而已,即他们只是有规律的而递减或递增。
(2)可以通过转化过程使问题回到对原问题的求解。
(3)必须要有一个明确的结束递归的条件,否则递归会无止境的进行下去。
3 回溯算法
回溯法是搜索算法中的一种控制策略,它是从初始状态出发,运用题目给出的条件、规则,按照深度优先搜索的顺序扩展所有可能情况,从中找出满足题意要求的解答。即:
从问题的某一种可能出发,搜索从这种情况出发所能达到的所有可能,如果有路可以走下去,就走到下一个状态,继续按照这种规则搜索;当这条路走到“尽头”而没有达到目标状态的时候,在倒回上一个出发点,从另一个可能出发,继续搜索,直到达到目标状态。
例如:迷宫求解
从迷宫的入口进去后是如何找到出口的?
如果你不了解迷宫结构显然只能是摸索着前进,比如先往一个方向走,若走不通就只能退回来在试试另个一个方向,但在走的过程中你一定会有意识的“记住”你已经走过的路,否则你会被困在迷宫中永远也走不出来了。
递归与回溯算法详解
最新推荐文章于 2024-04-10 21:43:39 发布