利用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条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- Linux系统CentOS6、CentOS7手动修改IP地址
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度
- 设置Eclipse缩进为4个空格,增强代码规范
- 面试大杂烩
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- Docker使用Oracle官方镜像安装(12C,18C,19C)