递归和汉诺塔问题

164 阅读2分钟

这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

递归

递归的特点

  • 会调用自身
  • 结束条件 我们看以下四个函数,看哪些函数符合递归:

image.png

  1. 第一个函数func1,虽然它调用的自身,但是它没有结束条件,如果调用这个函数它会一直调用自身,是一个死递归。
  2. 第二个函数func2,虽然它看似加了一个结束条件,但是当传入的参数x本身大于0时,这个递归就不会停止,也是一个死递归。
  3. 第三个函数func3,它满足递归的两个条件,是合法递归。
  4. 第四个函数func4,它和func3一样是一个合法递归,但是它们打印x的位置不一样。由于递归的性质,如果将x=3传入两个函数,func3会打印321,func4会打印123.

汉诺塔问题

什么是汉诺塔问题

汉诺塔题是递归中一个非常著名的算法问题,它来自古代的一个传说,这个问题的具体来源和内容如下:

image.png

假设有A,B,C三个柱子,要将柱子A上的n个圆盘移动到柱子C上。 当n=1时:直接将圆盘从A移动C即可 当n=2时:

  1. 首先将小圆盘从A移动到B
  2. 然后将大圆盘从A移动到C
  3. 最后将小圆盘从B移动到C 当为n个圆盘时: 我们将前n-1个圆盘作为整体,将第n个也就是A上最下面的一个圆盘作为一个整体,移动的过程为以下几步:
  4. 首先将n-1个圆盘从A经过C移动到B
  5. 然后将第n个圆盘从A移动到C
  6. 最后将n-1个圆盘从B经过A移动到C 我们看第1步和第3步,它们时比原问题规模小了1的同样一个问题,这就是递归,这两步原问题递归的子问题(规模比原问题小)。

汉诺塔问题实现(python)

python实现如下,n为圆盘的数量,a、b、c分别为A、B、C三个柱子。 image.png