数据结构与算法(十一)递归

递归


什么是递归?

程序调用自身的编程技巧称为递归(recursion)。递归作为一种算法在程序设计语言中广泛使用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转换为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少程序的代码量。递归的能力在于用有限的语句来定义对象的无线集合。

一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

前进段其实就是递归思想的转换部分,把一个大型复杂的问题层层转换为一个与原问题相似的规模较小的问题来求解,这个思想与分治算法思想相同,分治算法不同于冒泡排序、选择排序等算法,它没有具体的操作流程,它是解决问题的一种思想。

前进段与分治算法

当我们求解某些问题时,由于这些问题要处理的数据相当多,或求解过程相当复杂,使得直接求解方法在时间上相当长,或者根本无法直接求出。对于这类问题,我们往往先把它分解成几个子问题,找到求出这几个子问题的解法后,再找到合适的方式,把它们组合成求整个问题的解法。如果这些子问题还较大,难以解决,可以再把它们分成几个更小的子问题,以此类推,直至可以直接求出解为止。这就是分治算法的基本思想,分而治之。

之前学习数组中查找数组元素的一种方法二分查找就属于分治算法的例子。

返回段与回溯算法

回溯算法实际上是一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。回溯法是一种选优搜索法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就回退再走的技术称为回溯法,而满足回溯条件的某个状态的点称为“回溯”点。许多复杂的,规模较大的问题都可以使用回溯法,有“通用解题方法”的美称。

循环与递归

简单来说,循环是有去无回,而递归则是有去有回(因为存在终止条件)。

举个例子,你用你手中的钥匙打开一扇门,结果去发现前面还有一扇门,紧接着你又用钥匙打开了这扇门,然后你又看到一扇门…但是当你开到某扇门时,发现前方是一堵墙无路可走了,你选择原路返回——这就是递归

但是如果你打开一扇门后,同样发现前方也有一扇们,紧接着你又打开下一扇门…直到打开最后一扇门出去,或者一直没有碰到尽头 (死循环)——这就是循环。

最后从以下几个方面概括递归:

  • 递归的表现:函数调用函数自己

    递归的用处:将大型复杂问题化解为若干小问题进行求解

    递归的好处:代码量少

    递归的弊端:占空间,函数是基于栈内存运行的

    递归的要素:前进段,边界条件,返回段

发布了70 篇原创文章 · 获赞 56 · 访问量 1961

猜你喜欢

转载自blog.csdn.net/qq_43624033/article/details/104098786