python---使用递归实现谢尔宾斯基三角形及汉诺塔
渐入佳境。
# coding: utf-8 import turtle ''' # =================turtle练手== def draw_spiral(my_turtle, line_len): if line_len > 0: my_turtle.forward(line_len) my_turtle.right(70) draw_spiral(my_turtle, line_len-10) my_tur = turtle.Turtle() my_win = turtle.Screen() draw_spiral(my_tur, 200) my_win.exitonclick() # =================分形树== def tree(branch_len, my_turtle): if branch_len > 5: my_turtle.forward(branch_len) my_turtle.right(20) tree(branch_len-15, my_turtle) my_turtle.left(40) tree(branch_len - 15, my_turtle) my_turtle.right(20) my_turtle.backward(branch_len) my_tur = turtle.Turtle() my_win = turtle.Screen() my_tur.left(90) my_tur.up() my_tur.backward(100) my_tur.down() my_tur.color('green') tree(100, my_tur) my_win.exitonclick() # =================谢尔宾斯基三角形== def draw_triangle(points, color, my_turtle): my_turtle.fillcolor(color) my_turtle.up() my_turtle.goto(points[0][0], points[0][1]) my_turtle.down() my_turtle.begin_fill() my_turtle.goto(points[1][0], points[1][1]) my_turtle.goto(points[2][0], points[2][1]) my_turtle.goto(points[0][0], points[0][1]) my_turtle.end_fill() def get_mid(p1, p2): return (p1[0]+p2[0])/2, (p1[1]+p2[1])/2 def sierpinski(points, degree, my_turtle): color_map = ['blue', 'red', 'green', 'white', 'yellow', 'violet', 'orange'] draw_triangle(points, color_map[degree], my_turtle) if degree > 0: sierpinski([points[0], get_mid(points[0], points[1]), get_mid(points[0], points[2])], degree-1, my_turtle) sierpinski([points[1], get_mid(points[0], points[1]), get_mid(points[1], points[2])], degree-1, my_turtle) sierpinski([points[2], get_mid(points[2], points[1]), get_mid(points[0], points[2])], degree-1, my_turtle) my_tur = turtle.Turtle() my_win = turtle.Screen() my_points = [[-100, -50], [0, 100], [100, -50]] sierpinski(my_points, 4, my_tur) my_win.exitonclick() ''' # =======================================汉诺塔== def move_tower(height, from_pole, to_pole, with_pole): if height >= 1: move_tower(height-1, from_pole, with_pole, to_pole) move_disk(from_pole, to_pole, height) move_tower(height-1, with_pole, to_pole, from_pole) def move_disk(fp, tp, disk_name): print('moving 碟子 {0} from {1} to {2}'.format(disk_name, fp, tp)) high = 4 move_tower(high, '起始杆', '末尾杆', '中间杆')
C:\Users\Sahara\.virtualenvs\untitled\Scripts\python.exe D:/test/python_recursion.py moving 碟子 1 from 起始杆 to 中间杆 moving 碟子 2 from 起始杆 to 末尾杆 moving 碟子 1 from 中间杆 to 末尾杆 moving 碟子 3 from 起始杆 to 中间杆 moving 碟子 1 from 末尾杆 to 起始杆 moving 碟子 2 from 末尾杆 to 中间杆 moving 碟子 1 from 起始杆 to 中间杆 moving 碟子 4 from 起始杆 to 末尾杆 moving 碟子 1 from 中间杆 to 末尾杆 moving 碟子 2 from 中间杆 to 起始杆 moving 碟子 1 from 末尾杆 to 起始杆 moving 碟子 3 from 中间杆 to 末尾杆 moving 碟子 1 from 起始杆 to 中间杆 moving 碟子 2 from 起始杆 to 末尾杆 moving 碟子 1 from 中间杆 to 末尾杆 Process finished with exit code 0
python---使用递归实现谢尔宾斯基三角形及汉诺塔的更多相关文章
- Python使用递归绘制谢尔宾斯基三角形
谢尔宾斯基三角形使用了三路递归算法,从一个大三角形开始,通过连接每一个边的中点,将大三角型分为四个三角形,然后忽略中间的三角形,依次对其余三个三角形执行上述操作. 运行效果: 源代码: 1 impor ...
- 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫
定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...
- python 使用turtule绘制递归图形(螺旋、二叉树、谢尔宾斯基三角形)
插图工具使用Python内置的turtle模块,为什么叫这个turtle乌龟这个名字呢,可以这样理解,创建一个乌龟,乌龟能前进.后退.左转.右转,乌龟的尾巴朝下,它移动时就会画一条线.并且为了增加乌龟 ...
- 小练手:用HTML5 Canvas绘制谢尔宾斯基三角形
文章首发于我的知乎专栏,原地址:https://zhuanlan.zhihu.com/p/26606208 以前看到过一个问题:谢尔宾斯基三角形能用编程写出来么?该怎么写? - 知乎,在回答里,各方大 ...
- 分形之谢尔宾斯基(Sierpinski)三角形
谢尔宾斯基三角形(英语:Sierpinski triangle)是一种分形,由波兰数学家谢尔宾斯基在1915年提出,它是一种典型的自相似集.也有的资料将其称之为谢尔宾斯基坟垛. 其生成过程为: 取一个 ...
- 分形之谢尔宾斯基(Sierpinski)地毯
前面讲了谢尔宾斯基三角形,和这一节的将把三角形变为正方形,即谢尔宾斯基地毯,它是由瓦茨瓦夫·谢尔宾斯基于1916年提出的一种分形,是自相似集的一种. 谢尔宾斯基地毯的构造与谢尔宾斯基三角形相似,区别仅 ...
- 分形之谢尔宾斯基(Sierpinski)四面体
前面讲了谢尔宾斯基三角形,这一节的将对二维三角形扩展到三维,变成四面体.即将一个正四面体不停地拆分,每个正四面体可以拆分成四个小号的正四面体.由二维转变到三维实现起来麻烦了许多.三维的谢尔宾斯基四面体 ...
- 混沌分形之谢尔宾斯基(Sierpinski)
本文以使用混沌方法生成若干种谢尔宾斯基相关的分形图形. (1)谢尔宾斯基三角形 给三角形的3个顶点,和一个当前点,然后以以下的方式进行迭代处理: a.随机选择三角形的某一个顶点,计算出它与当前点的中点 ...
- 【python】递归(阶乘、斐波纳契、汉诺塔)
随机推荐
- linux syscall 详解【转】
转自:https://blog.csdn.net/feixin620/article/details/78416560 引言:分析Android源码的过程中,要想从上至下完全明白一行代码,往往涉及ap ...
- Linux IDR机制【转】
转自:https://blog.csdn.net/av_geek/article/details/49640433 IDR机制在Linux内核中指的是整数ID管理机制. 实质上来讲,这就是一种将一个整 ...
- DFS不怂之《leetcode-岛屿的个数》
leetcode刷到这道题: 给定一个由 '1'(陆地)和 '0'(水)组成的的二维网格,计算岛屿的数量.一个岛被水包围,并且它是通过水平方向或垂直方向上相邻的陆地连接而成的.你可以假设网格的四个边均 ...
- 利用jsoncpp将json字符串转换为Vector
在API测试过程中经常会遇到传入参数为复杂类型,一般情况下在python下,习惯用字典来表示复杂类型.但是c++对字符串的处理是比较弱智的,一般c++里边会用vector来存储复杂类型,那么就存在转换 ...
- 64位进程调用32位dll的解决方法 / 程序64位化带来的问题和思考
最近做在Windows XP X64,VS2005环境下做32位程序编译为64位程序的工作,遇到了一些64位编程中可能遇到的问题:如内联汇编(解决方法改为C/C++代码),long类型的变化,最关键的 ...
- NTSC、PAL、SECAM三大制式简介
NTSC.PAL.SECAM三大制式简介 NTSC.PAL和SECAM是全球三大主要的电视广播制式,这三种制式是不能互相兼容的,例如在PAL制式的电视上播放NTSC的视频,则影像画面将不能正常显示.下 ...
- Unity3D Shader 入门
什么是Shader Shader(着色器)是一段能够针对3D对象进行操作.并被GPU所执行的程序,它负责将输入的Mesh(网格)以指定的方式和输入的贴图或者颜色等组合作用,然后输出.绘图单元可以依据这 ...
- java 批量插入 Oracle
sql = "INSERT INTO LOG_FILENAME(ID,FILENAME,CREATETIME) VALUES(2,?,sysdate)"; public void ...
- css3 翻转
参考资料: WEB骇客 : http://www.webhek.com/css-flip/ Demo : Demo(谷歌浏览器观看,没做兼容) Demo截图: 代码: <!DOCTYPE h ...
- Find Lines
(Uva 6955可以直接随机,湖大OJ 13348 要优化) 题意:给出 n个点的坐标, 一个 百分数p, 求是否有一条直线上有 n * p /100个点… 随机化算法,但也要优化下……(TLE, ...