算法之刻画指定尺的刻度由次引发的简单汉诺塔代码实现

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

原文地址:https://www.cnblogs.com/xushouyi/p/11167038.html

时间: 2024-10-09 22:12:02

算法之刻画指定尺的刻度由次引发的简单汉诺塔代码实现的相关文章

2018年全国多校算法寒假训练营练习比赛(第一场)D N阶汉诺塔变形

https://www.nowcoder.com/acm/contest/67/D 思路: 先手动模拟一下过程,以下是模拟过程,按顺序表示第几步需要移动的盘标号 1 1 2 1 1 2 1 1 3 1 1 2 1 1 2 1 1 3 1 1 2 1 1 2 1 1 4 1 1 2 ...... 我们发现每出现两次1就会出现一次2,每两次2就会出现一次3,每两次3就会出现一次4,每两次4就会出现一次5...... 然后我们发现如果把所有大于1的标号看成1,那么k步1出现的次数是 k/1 如果把所有

C语言之算法初步(汉诺塔--递归算法)

个人觉得汉诺塔这个递归算法比电子老鼠的难了一些,不过一旦理解了也还是可以的,其实网上也有很多代码,可以直接参考.记得大一开始时就做过汉诺塔的习题,但是那时代码写得很长很长,也是不理解递归的结果.现在想起来汉诺塔的算法就3个步骤:第一,把a上的n-1个盘通过c移动到b.第二,把a上的最下面的盘移到c.第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了.所以算法看起来就简单多了.不过,思考过程还是很痛苦的,难以理解.递归中会保存数据的好处在这里又得到体现,太神奇了. 汉诺塔代码如下:

基于Python的汉诺塔算法

首先贴出Python编写的汉诺塔算法的代码: def hanoti(n,x1,x2,x3):    if(n == 1):        print('move:',x1,'-->',x3)        return    hanoti(n-1,x1,x3,x2)    print('move:',x1,'-->',x3)    hanoti(n-1,x2,x1,x3) hanoti(3,'A','B','C') 汉诺塔问题归根结底就是一个循环问题,循环包括两大要素:循环体.循环结束条件 首

Java算法分析2—————几种排序&汉诺塔算法

一:插入排序 /* * 插入排序 */ /* * 原序列 [12] 15 9 20 6 31 24 * 第0趟 [12 15] 9 20 6 31 24 * 第1趟 [9 12 15] 20 6 31 24 * 第2趟 [9 12 15 20] 6 31 24 * 第3趟 [6 9 12 15 20] 31 24 * n个数,一共需要多少趟?n个数,n-1趟 * 第0趟,把1位置的数,和1位置之前的数进行比较,按大小顺序排列 * 第1趟,把2位置的数,和2位置之前的数进行比较,按大小顺序排列 .

汉诺塔算法

首先介绍下汉诺塔: 汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 算法思想: 主要是递归方法的使用:假设有A.B.C三根柱子,用户输入盘子的数目,开始的时候盘子全部在A上,通过B将所有的盘子移动到C上. 盘子数目为n 1.当n=1时,直接将A上的盘子移到C上

【数据结构与算法】汉诺塔算法——java递归实现

汉诺塔的递归实现算法,将A中的圆盘借助B圆盘完全移动到C圆盘上, 每次只能移动一个圆盘,并且每次移动时大盘不能放在小盘上面 递归函数的伪算法为如下: if(n == 1)    直接将A柱子上的圆盘从A移动到C else    先将A柱子上的n-1个圆盘借助C柱子移动到B柱子上    直接将A柱子上的第n个圆盘移动到C柱子上    最后将B柱子上的n-1个圆盘借助A柱子移动到C柱子上 该递归算法的时间复杂度为O(2的n次方),当有n个圆盘时,需要移动圆盘2的n次方-1次 public class

20150410 递归实现汉诺塔算法

20150410 递归实现汉诺塔算法 2015-04-10 Lover雪儿 1 //汉诺塔 2 #include <stdio.h> 3 4 static int i = 0; 5 6 //将n个盘子从x借助y移动z 7 //n:移动的个数 x:源地址 y:中间柱子 z:目的柱子 8 void move(int n, char x, char y, char z) 9 { 10 if(1 == n){ 11 printf("第%d次移动 %c--->%c\n", ++

韩顺平_PHP程序员玩转算法公开课(第一季)01_算法重要性_五子棋算法_汉诺塔_回溯算法_学习笔记_源代码图解_PPT文档整理

文西马龙:http://blog.csdn.net/wenximalong/ 课程说明:算法是程序的灵魂,为什么有些网站能够在高并发,和海量吞吐情况下依然坚如磐石,大家可能会说: 网站使用了服务器集群技术.数据库读写分离和缓存技术(比如memcahced和redis等),那如果我再深入的问一句,这些优化技术又是怎样被那些天才的技术高手设计出来的呢? 我在上大学的时候就在想,究竟是什么让不同的人写出的代码从功能看是一样的,但从运行效率上却有天壤之别, 就拿以前在软件公司工作的实际经历来说吧, 我是

[算法]——汉诺塔的递归深度

今天早晨在上班的路上,一好朋友突然提到之前的一个计算机的考题,汉诺塔(相信大家都玩过)的递归深度. 由于很久没有看算法,以及脑容量有限,当时没有多想. 来到公司后,把公式列了一下,终于清晰多了. 下面假设3根柱子编号为1,2,3. 主要思路: 把n个圆盘从3号移到1号 = 把n-1个圆盘从3号移到2号 + 把第n个圆盘从3号移到1号 + n-1个圆盘从2号移到1号 列出公式: f(n) = f(n-1) + 1 + f(n-1) = 2f(n-1) + 1 计算公式: 接下来就是数学题了, 利用