Python版数据结构与算法(2):递归解汉诺塔问题如何实现?

2026-05-16 15:551阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计622个文字,预计阅读时间需要3分钟。

Python版数据结构与算法(2):递归解汉诺塔问题如何实现?

递归简介+递归的两个特点:应用自身和结束条件+应用自身和结束条件示例:pythondef func(x): if x==0: print(x) else: print(x) func(x - 1)

func(3)结果:

32

1


递归简介

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

如:

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、汉诺塔问题

  • 汉诺塔问题:
  • 当n=2时操作步骤:
    原始状况如下,目标是将A上的两个都移动到C上
  • 步骤一:将A上的小盘从A移动到B
  • 步骤二:将A盘上的大盘移动到C
  • 步骤三:将B上的小盘移动到C,结束
  • 当n个盘时,思路是将A上的n-1个盘看做是一个小盘,将A最下面的大盘看做是一个大盘,此时即和n=2时的思路一致了
  • 步骤一:将A上n-1个盘移动到B
  • 步骤二:将A上最下面的大盘移动到C盘
  • 步骤三:将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")

执行结果如下:

Python版数据结构与算法(2):递归解汉诺塔问题如何实现?

---------------- 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


本文共计622个文字,预计阅读时间需要3分钟。

Python版数据结构与算法(2):递归解汉诺塔问题如何实现?

递归简介+递归的两个特点:应用自身和结束条件+应用自身和结束条件示例:pythondef func(x): if x==0: print(x) else: print(x) func(x - 1)

func(3)结果:

32

1


递归简介

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

如:

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、汉诺塔问题

  • 汉诺塔问题:
  • 当n=2时操作步骤:
    原始状况如下,目标是将A上的两个都移动到C上
  • 步骤一:将A上的小盘从A移动到B
  • 步骤二:将A盘上的大盘移动到C
  • 步骤三:将B上的小盘移动到C,结束
  • 当n个盘时,思路是将A上的n-1个盘看做是一个小盘,将A最下面的大盘看做是一个大盘,此时即和n=2时的思路一致了
  • 步骤一:将A上n-1个盘移动到B
  • 步骤二:将A上最下面的大盘移动到C盘
  • 步骤三:将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")

执行结果如下:

Python版数据结构与算法(2):递归解汉诺塔问题如何实现?

---------------- 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