递归(Recursion),在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。

在使用递归时,需要注意以下几点:

  • 递归就是在过程或函数里调用自身
  • 必须有一个明确的递归结束条件,称为递归出口。

注意: 切勿忘记递归出口,避免函数无限调用。

实例

使用递归实现阶乘计算:

python学习记录——递归

使用迭代实现

现在,使用迭代来实现。

python学习记录——递归

使用迭代来实现汉诺塔游戏

汉诺塔主要是有三个塔座X,Y,Z,要求将从小到大编号为 1,2.....n 的圆盘从X移动到塔座Z上,要求

       1、每次只能移动一个圆盘

       2、圆盘可以插到X,Y,Z中任一塔座上

       3、任何时候不能将一个较大的圆盘压在较小的圆盘之上

       4、初始:所有圆盘都在 X 塔座,并且最大的圆盘在最底部,然后是次大的

       5、结束:所有圆盘都在 Z 塔座,并且最大的圆盘在最底部,然后是次大的 

 递归算法:

        n == 1时,把盘1从X移动到Z

        当n > 1时

                     1、将n-1个圆盘(每次移动一个)从X移动到临时塔Y

                     2、将盘n从X移动到目的地Z

                     3、将n-1个圆盘(每次移动一个)从临时塔Y移动到目的塔Z

(实际理解为,每次移动盘子,都是将盘子从X移动到Z。所以将n-1个圆盘从X移动到临时塔Y,这一步操作中将Y理解为Z,即调用本身时传入的Y为Z,所以盘子是从X移动到Z;同理将n-1个盘子从临时塔Y移动到Z时,理解为Y为X,即调用本身是传入的Y为X,所以盘子还是从X移动到Z)

python学习记录——递归

结果如下:

python学习记录——递归

递归的优缺点:

优点:

  • 递归使代码看起来更加整洁、优雅
  • 可以用递归将复杂任务分解成更简单的子问题
  • 使用递归比使用一些嵌套迭代更容易

缺点:

  • 递归的逻辑很难调试、跟进
  • 递归调用的代价高昂(效率低),因为占用了大量的内存和时间。

相关文章: