利用graphviz模块展示斐波那契数列的递归函数调用图(Python)
在博客动态规划法(一)从斐波那契数列谈起中,在求解斐波那契数列的第n项时,我们采用了递归方法和动态规划法来求解,当然递归方法的效率很差。本文将利用graphviz模块来展示斐波那契数列的递归函数调用图。
利用递归函数来求解斐波那契数列的第n项的Python代码如下:
# recursive method def fib(n): if n <= 1: return n else: return fib(n-1) + fib(n-2) t = fib(10) print(t)
为了展示该递归方法的函数调用图,我们可以用graphviz模块来绘制该流程图。Graphviz (英文:Graph Visualization Software的缩写)是一个由AT&T实验室启动的开源工具包,用于绘制DOT语言脚本描述的图形。在Python中,它的实现模块为graphviz, 其API参考文档为: http://graphviz.readthedocs.io/en/latest/index.html 。
下面将给出n=6时递归函数的调用图, Python代码如下:
from graphviz import Digraph import uuid import random # colors for labels of nodes colors = ['tomato', 'skyblue', 'orange', 'purple', 'green', 'yellow', 'gray', 'pink'] # n: the nth item in Fabonacci sequence # dot: Digraph object # label: label of each node # parent: label of parent node def fib(n, dot, label, parent): if n <= 1: return n, dot else: random.shuffle(colors) # create node with style='filled' and random color dot.node(label[0], 'fib(%s)'%(n-1),style='filled',color=colors[0]) dot.node(label[1], 'fib(%s)'%(n-2),style='filled',color=colors[1]) # connect the new created nodes with parent node dot.edge(label[0], parent) dot.edge(label[1], parent) # generate new label using uuid() function label1 = [str(uuid.uuid1()) for _ in label] label2 = [str(uuid.uuid1()) for _ in label] return fib(n-1, dot, label1, label[0])+fib(n-2, dot, label2, label[1]), dot # test dot = Digraph() n = 6 # the nth item in Fabonacci sequence label = ['a', 'b'] # initial labels t, dot = fib(n, dot, label, parent='fib(%s)'%n) # save the source code of dot to gv file print(dot.source) dot.render('E:\\fib_graph.gv')
运行完上述程序后,会在E盘下生成fib_graph.gv文件,再用Graphviz软件打开,生成图片,如下:
本次分享仅作为graghviz模块的一个例子,欢迎广大读者能提供更多例子~~
本次分享到此结束,欢迎大家交流~~
注意:本人现已开通两个微信公众号: 用Python做数学(微信号为:python_math)以及轻松学会Python爬虫(微信号为:easy_web_scrape), 欢迎大家关注哦~~

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
精读《你不知道的javascript》中卷
前言 《你不知道的 javascript》是一个前端学习必读的系列,让不求甚解的JavaScript开发者迎难而上,深入语言内部,弄清楚JavaScript每一个零部件的用途。本书《你不知道的javascript》中卷介绍了该系列的两个主题:“类型和语法”以及“异步与性能”。这两块也是值得我们反复去学习琢磨的两块只是内容,今天我们用思维导图的方式来精读一遍。(思维导图图片可能有点小,记得点开看,你会有所收获) 第一部分 作用域和闭包 类型 JavaScript 有 七 种 内 置 类 型: null 、 undefined 、 boolean 、 number 、 string 、 object 和 symbol ,可以使用 typeof 运算符来查看。 变量没有类型,但它们持有的值有类型。类型定义了值的行为特征。 很多开发人员将 undefined 和 undeclared 混 为 一 谈, 但 在 JavaScript 中 它 们 是 两 码 事。 undefined 是值的一种。 undeclared 则表示变量还没有被声明过。 遗憾的是, JavaScript 却将它们混为一谈...
- 下一篇
【机器学习工具榜单】Tensorflow最多使用,Python 取代 R 成最受欢迎编程语言
近日,KDnuggets网站公布了2018年度的数据科学和机器学习工具调查结果。2300多名参与者对自己“过去 12 个月内在项目开发中使用过的数据挖掘 / 机器学习工具和编程语言”进行了投票。 最受欢迎的分析、数据科学、机器学习工具 图1:2018年最受欢迎的分析/数据科学/机器学习工具,以及与2016~2017年调查结果的对比 下表列举了最受欢迎的前11个工具,其中每个的占比都达到20%以上。 表1:2018年最受欢迎的分析/数据科学/ 机器学习软件Top 10 上表中,2018 % share 是指使用这个工具的人占所有投票者的百分比,% change是指2018年相较2017年的投票变化。 每个受访者平均使用的工具数量为7.0个,略高于2017年的6.75个(排除了只选择1个工具的投票)。 与2017年的软件调查相比,今年新进入Top
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- Hadoop3单机部署,实现最简伪集群
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS7设置SWAP分区,小内存服务器的救世主
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Windows10,CentOS7,CentOS8安装Nodejs环境
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长