1.案例描述

将递归函数与循环函数结合绘制2.0的图形

2.案例分析

3.上机实验

"""
作者:梁斌
功能:五角星的绘制
版本:3.0
日期:03/08/2017
新增功能:加入循环操作绘制重复不同大小的图形
新增功能:使用迭代函数绘制重复不同大小的图形
"""
import turtle def draw_pentagram(size):
"""
绘制五角星
"""
# 计数器
count = 1
while count <= 5:
turtle.forward(size)
turtle.right(144)
# count = count + 1
count += 1 def draw_recursive_pentagram(size):
"""
迭代绘制五角星
"""
# 计数器
count = 1
while count <= 5:
turtle.forward(size)
turtle.right(144)
# count = count + 1
count += 1 # 五角星绘制完成,更新参数
size += 10
if size <= 100:
draw_recursive_pentagram(size) def main():
"""
主函数
""" turtle.penup()
turtle.backward(200)
turtle.pendown()
turtle.pensize(2)
turtle.pencolor('red') size = 50
draw_recursive_pentagram(size) turtle.exitonclick() if __name__ == '__main__':
main()

4.递归函数

递归(Recursion)是指在函数的定义中使用函数自身的方法。递归就是有去(递去)有回(归来)。

(1)递归三要素:

  • 明确递归终止条件;

  • 给出递归终止时的处理办法;

  • 提取重复的逻辑,缩小问题规模。

(2)递归典型算法设计模型

  • 在递去的过程中解决问题
function recursion(大规模){
if (end_condition){ // 明确的递归终止条件
end; // 简单情景
}else{ // 在将问题转换为子问题的每一步,解决该步中剩余部分的问题
solve; // 递去
recursion(小规模); // 递到最深处后,不断地归来
}
}
  • 在归来的过程中解决问题
function recursion(大规模){
if (end_condition){ // 明确的递归终止条件
end; // 简单情景
}else{ // 先将问题全部描述展开,再由尽头“返回”依次解决每步中剩余部分的问题
recursion(小规模); // 递去
solve; // 归来
}
}

Python实例(同时包含递去处理和归来处理)

# 树枝长度小于5时终止,每次树枝长度减少15(绘制右侧树枝后,原路返回到起点)
def draw_branch(branch_length):
if branch_length < 5:
return
else:
# 绘制右侧树枝
turtle.forward(branch_length)
print('向前 ', branch_length)
turtle.right(20)
print('右转 20')
draw_branch(branch_length - 15) # 返回之前的树枝
turtle.left(20)
print('左转 20')
turtle.backward(branch_length)
print('向后 ', branch_length)

(3)递归与循环

  • 递归与循环是两种不同的解决问题的典型思路,递归求解方式和循环求解方式往往可以互换。
  • 递归可以很清晰地描述了一个问题的求解过程,比循环更容易理解。但递归涉及函数调用开销,常常会带来性能问题,所以效率会比循环要低。
  • 建议在不影响程序的阅读的前提下,尽量使用循环,而不用递归。

(4)递归使用场景(第三种最常见)

  • 问题的定义是按递归定义的(Fibonacci函数,阶乘,…);
  • 问题的解法是递归的(有些问题只能使用递归方法来解决,例如,汉诺塔问题,…);
  • 数据结构是递归的(链表、树等的操作,包括树的遍历,树的深度,…)。

5.Pycharm技巧

(1)选中多行代码,Ctrl+l按一次注释,按两次取消注释。

(2)选中多行代码,Tab键缩行,Shift+Tab反向缩行。

(3)Alt + 上箭头,代码上移;Alt+下箭头,代码下移。

参考文档:

算法设计方法:递归的内涵与经典应用

【Python 15】分形树绘制3.0(递归函数)的更多相关文章

  1. 【Python 16】分形树绘制4.0(利用递归函数绘制分形树fractal tree)

     1.案例描述 树干为80,分叉角度为20,树枝长度小于5则停止.树枝长小于30,可以当作树叶了,树叶部分为绿色,其余为树干部分设为棕色. 2.案例分析 由于分形树具有对称性,自相似性,所以我们可以用 ...

  2. 【Python 14】分形树绘制2.0(重复五角星+Turtle库文档)

    1.案例描述 加入循环操作绘制重复不同大小的图形 2.案例分析 3.turtle库补充 # 画笔控制函数 turtle.penup() # 抬起画笔,之后移动画笔不绘制图形 turtle.pendow ...

  3. 【Python 13】分形树绘制1.0--五角星(turtle库)

    1.案例描述 2.案例分析 引入绘制图形的turtle库,利用库中函数进行编程. 3.turtle库 没有显示的input()和output(),没有赋值语句.调用形式大部分如下: import tu ...

  4. 【数据结构与算法Python版学习笔记】递归(Recursion)——定义及应用:分形树、谢尔宾斯基三角、汉诺塔、迷宫

    定义 递归是一种解决问题的方法,它把一个问题分解为越来越小的子问题,直到问题的规模小到可以被很简单直接解决. 通常为了达到分解问题的效果,递归过程中要引入一个调用自身的函数. 举例 数列求和 def ...

  5. python图片和分形树

    链接: 这10个Python项目很有趣! Python 绘制分形图(曼德勃罗集.分形树叶.科赫曲线.分形龙.谢尔宾斯基三角等)附代码 使用Python生成树形图案 神奇的代码:用 Python 生成分 ...

  6. 用python的turtle画分形树

    由于分形树具有对称性,自相似性,所以我们可以用递归来完成绘制.只要确定开始树枝长.每层树枝的减短长度和树枝分叉的角度,我们就可以把分形树画出来啦!! 代码如下: # -*- coding: utf-8 ...

  7. 随机L系统分形树 分类: 计算机图形学 2014-06-01 23:27 376人阅读 评论(0) 收藏

    下面代码需要插入到MFC项目中运行,实现了计算机图形学中的L系统分形树. class Node { public: int x,y; double direction; Node(){} }; CSt ...

  8. TokuDB的索引结构–分形树的实现

    分形树简介 原文:http://www.bitstech.net/2015/12/15/tokudb-index-introduction/ 分形树是一种写优化的磁盘索引数据结构. 在一般情况下, 分 ...

  9. 小学生都能学会的python(<lamda匿名函数,sorted(),filter(),map(),递归函数>)

    小学生都能学会的python(<<lamda匿名函数,sorted(),filter(),map(),递归函数,二分法>> 1. lambda 匿名函数 lambda 参数: ...

随机推荐

  1. BootStrap格栅系统

    格栅参数分为超小屏幕 手机 (<768px) 小屏幕 平板 (≥768px) 中等屏幕 桌面显示器 (≥992px) 大屏幕 大桌面显示器 (≥1200px) 栅格系统行为 总是水平排列 开始是 ...

  2. OO(object oriented面向对象)

    面向对象OO = 面向对象的分析OOA + 面向对象的设计OOD + 面向对象的编程OOP 一.OO - Object-Oriented(面向对象) 对象代表真实或抽象的事物,有一个名字(唯一标识), ...

  3. .NET Core微服务系列基础文章索引(目录导航Draft版)

    一.为啥要写这个系列? 今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有了一个感 ...

  4. 分享一个很通用c语言的Makefile

    编写Makefile是一个苦乐交织的事情,快乐是因为从一堆需要手工逐个处理的编译过程,进步到一条命令完成,看着代码顺畅的在屏幕上滚动,编译为最终的产品,那个过程无比愉悦:而痛苦则是,写代码已经很累了, ...

  5. javascript中的栈、队列。

                           javascript中的栈.队列 栈方法     栈是一种LIFO(后进先出)的数据结构,在js中实现只需用到2个函数 push()  接受参数并将其放置 ...

  6. Vue2.0中的transition组件

    组件的过度 Vue1.0中transition做为标签的行内属性被vue支持.但在Vue2.0中.Vue放弃了旧属性的支持并提供了transition组件,transition做为标签被使用. 使用t ...

  7. 精读《react-easy-state 源码》

    1. 引言 react-easy-state 是个比较有趣的库,利用 Proxy 创建了一个非常易用的全局数据流管理方式. import React from "react"; i ...

  8. mongodb分片扩展架构

    目录 一.简介 二.分片集群 三.数据分布策略 四.Mongos访问模式 五.Config元数据 六.分片均衡 参考文档 一.简介 MongoDB目前3大核心优势:『灵活模式』+ 『高可用性』 + 『 ...

  9. Docker系列05—Docker 存储卷详解

    本文收录在容器技术学习系列文章总目录 1.存储卷介绍 1.1 背景 (1)docker 的 AFUS 分层文件系统 docker镜像由多个只读层叠加面成,启动容器时,docker会加载只读镜像层并在镜 ...

  10. JS引擎线程的执行过程的三个阶段(一)

    浏览器首先按顺序加载由<script>标签分割的js代码块,加载js代码块完毕后,立刻进入以下三个阶段,然后再按顺序查找下一个代码块,再继续执行以下三个阶段,无论是外部脚本文件(不异步加载 ...