我正在学习递归,我写了这个(低效)第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)
但我无法弄清楚Fibonacci函数的树!那棵树会是什么样的?
提前致谢,
答案 0 :(得分:2)
例如 fibonacci(4)给出以下递归树,因为需要两个函数调用: fibonacci(3)和 fibonacci(2),所以每次调用该函数,都会调用其他两个函数,直到达到退出条件。
4
/ \
/ \
/ \
3 2
/ \ / \
/ \ / \
2 1 1 0
/ \
/ \
1 0
答案 1 :(得分:1)
您可以使用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上查看更多示例