【问题标题】:Recursion tree with Fibonacci -Python-斐波那契递归树-Python-
【发布时间】:2016-02-21 21:02:18
【问题描述】:

我正在学习递归,我写了这个(低效的)第 n 个斐波那契数计算器:

def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

我知道在递归中,您可以绘制所谓的“递归树”。当我制作这个简单的二进制生成器时:

def binary(length, outstr=""):
    if len(outstr) == length:
        print(outstr)
    else:
        for i in ["0", "1"]:
            binary(length, outstr + i)

我可以弄清楚这棵树的样子:

但我无法弄清楚斐波那契函数的树!那棵树会是什么样子?

提前致谢,

【问题讨论】:

标签: python recursion tree


【解决方案1】:

例如 fibonacci(4) 给出以下递归树,因为需要两个函数调用:fibonacci(3) 和 fibonacci(2),所以每次调用该函数,都会调用其他两个函数,直到达到退出条件。

            4
           / \
          /   \
         /     \
        3       2
       / \     / \
      /   \   /   \
     2     1 1     0
    / \
   /   \
  1     0

【讨论】:

  • 谢谢,正是我需要的!
【解决方案2】:

您可以使用 Python 中的 recursion-visualiser 包轻松可视化任何递归函数。您只需将装饰器添加到您的函数中,剩下的就交给它了。

二进制字符串

让我们先为二进制字符串做。

from visualiser.visualiser import Visualiser as vs

"""
Problem Link: https://stackoverflow.com/questions/33808653/recursion-tree- 
with-fibonacci-python/60126306#60126306
"""

@vs(node_properties_kwargs={"shape":"record", "color":"#f57542","style":"filled", "fillcolor":"grey"})
def binary(length, outstr=""):
     if len(outstr) == length:
          print(outstr)
     else:
          for i in ["0", "1"]:
               binary(length=length, outstr=outstr + i)

binary(length=3,outstr="")
vs.make_animation("binary_string.gif", delay=2)

这是输出动画的样子

最后的树也保存为:

斐波那契: 让我们为 fib(6) 可视化它

# Import Visualiser class from module visualiser
from visualiser.visualiser import Visualiser as vs

# Add decorator
@vs(node_properties_kwargs={"shape":"record", "color":"#f57542", "style":"filled", "fillcolor":"grey"})
def fib(n):
    if n <= 1:
        return n
    return fib(n=n - 1) + fib(n=n-2)

def main():
    print(fib(n=6))
    vs.make_animation("fibonacci.gif", delay=2)

if __name__ == "__main__":
    main()

这是看起来好多了的输出:

这是递归树的最终图像:

在here查看更多示例

【讨论】:

  • 链接已损坏
  • 我只需要把它放在脚本的任何地方还是在主目录中? os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'
  • 您需要下载graphviz并将graphviz可执行文件添加到PATH。您可以从环境变量手动执行,或者使用上述脚本添加它。如果您是从 pip 安装,则上述过程可能无法正常工作。您可能必须手动进行。这是可以帮助您设置graphviz的链接bobswift.atlassian.net/wiki/spaces/GVIZ/pages/20971549/…如果出现任何问题,请随时在github上打开问题。
猜你喜欢
  • 2010-12-03
  • 2014-04-02
  • 1970-01-01
  • 2017-11-18
  • 2014-01-08
  • 2011-12-14
  • 2012-11-29
  • 2018-04-10
相关资源
最近更新 更多