算法之刻画指定尺的刻度由次引发的简单汉诺塔代码实现
1.刻度尺递归优美实现
1 # 画英式标尺,刻度线长度为 n 的 m 英寸标尺 2 # 对于开始 L = 0,直接绘制 该刻度 3 # 那么一般的情况有, 4 # 中央刻度 L >= 1 时 有 5 # 一个中央刻度为 L-1 的刻度间隔 6 # 一个中央刻度为 L 的间隔 7 # 一个中央刻度为 L-1 的间隔 8 # 设计思路: 分三个功能函数,一个构建整体的 刻度尺, 一个接受画几条刻度线, 一个输出 应该画几条刻度线 9
10 def draw_line(tick_length, tick_label=""): 11 """绘制刻度线 12 """ 13 14 line = "- " * tick_length 15 16 # 是否要添加数字 17 if tick_label: 18 line = "".join([line, str(tick_label)]) 19 20 # 输出 21 print(line) 22 23 24 def draw_interval(center_length): 25 """刻画中间刻度 26 """
27 if center_length > 0: 28 draw_interval(center_length - 1) # L-1 29 draw_line(center_length) # L 30 draw_interval(center_length - 1) # L-1 31 32 33 def draw_ruler(num_inches, major_length): 34 """构建刻度尺 35 """ 36 37 draw_line(major_length, "0") # L=0 38 39 for j in range(1, 1 + num_inches): # 从1开始迭代 40 draw_interval(major_length - 1) # 每一英寸的中间刻度绘制 41 draw_line(major_length, str(j)) # 每英寸的主刻度绘制
2.汉诺塔优美实现
# 汉诺塔 # 当 n = 0 时,无意义 # 当 n = 1 时, a->c # 当 n = 2 时, a->b, a->c, b->c # 观查可知 整体的操作宏观上来讲是一个 a->c 的过程 # 当n>0时,无意义 # 一般情况为 # a->b # a->c # b->c
def fun(a, b, c, n): if n > 0: fun(a, c, b, n - 1) # a -> b print(f"第{i}次 {a}-->{c}") # a -> c fun(b, a, c, n - 1) # b -> c