0
点赞
收藏
分享

微信扫一扫

数据结构与算法python版(2)-递归与汉诺塔问题


递归简介

  • 递归的两个特点:调用自身和结束条件

如:

def func(x):
if x>0:
print(x)
func(x-1)

func(3)

执行结果如下:

3
2
1

这里需要注意一下,如将打印语句放到下面,如下代码,结果将是完全不一样的

def func(x):
if x>0:
func(x-1)
print(x)

func(3)

执行结果如下:

1
2
3

2、汉诺塔问题

  • 汉诺塔问题:
  • 数据结构与算法python版(2)-递归与汉诺塔问题_递归

  • 当n=2时操作步骤:
    原始状况如下,目标是将A上的两个都移动到C上
  • 数据结构与算法python版(2)-递归与汉诺塔问题_算法_02

  • 步骤一:将A上的小盘从A移动到B
  • 数据结构与算法python版(2)-递归与汉诺塔问题_递归_03

  • 步骤二:将A盘上的大盘移动到C
  • 数据结构与算法python版(2)-递归与汉诺塔问题_递归_04

  • 步骤三:将B上的小盘移动到C,结束
  • 数据结构与算法python版(2)-递归与汉诺塔问题_算法_05

  • 当n个盘时,思路是将A上的n-1个盘看做是一个小盘,将A最下面的大盘看做是一个大盘,此时即和n=2时的思路一致了
  • 数据结构与算法python版(2)-递归与汉诺塔问题_数据结构_06

  • 步骤一:将A上n-1个盘移动到B
  • 数据结构与算法python版(2)-递归与汉诺塔问题_python_07

  • 步骤二:将A上最下面的大盘移动到C盘
  • 数据结构与算法python版(2)-递归与汉诺塔问题_python_08

  • 步骤三:将B上的n-1个盘移动到C盘上
  • 算法实现如下:

def hanoi(n,a,b,c):
"""
将n个盘从a经过b移动到c
:param n:
:param a:
:param b:
:param c:
:return:
"""
if n>0:
hanoi(n-1,a,c,b)
print(f"moving {n} from {a} to {c}")
hanoi(n-1,b,a,c)

if __name__=="__main__":
print("---------------- n=2 -----------------------------")
hanoi(2,"A","B","C")
print("---------------- n=3 -----------------------------")
hanoi(3, "A", "B", "C")
print("---------------- n=4 -----------------------------")
hanoi(4, "A", "B", "C")

执行结果如下:

---------------- n=2 -----------------------------
moving 1 from A to B
moving 2 from A to C
moving 1 from B to C
---------------- n=3 -----------------------------
moving 1 from A to C
moving 2 from A to B
moving 1 from C to B
moving 3 from A to C
moving 1 from B to A
moving 2 from B to C
moving 1 from A to C
---------------- n=4 -----------------------------
moving 1 from A to B
moving 2 from A to C
moving 1 from B to C
moving 3 from A to B
moving 1 from C to A
moving 2 from C to B
moving 1 from A to B
moving 4 from A to C
moving 1 from B to C
moving 2 from B to A
moving 1 from C to A
moving 3 from B to C
moving 1 from A to B
moving 2 from A to C
moving 1 from


举报

相关推荐

0 条评论