跳转到内容

可视化计算/调用树

来自维基教科书,开放世界中的开放书籍

调用树是特定实例中调用的函数的视觉表示。例如,考虑递归函数

    def even(i): # return True iff i is an even number
           return i % 2 == 0
    def power(base, exp):
           if exp == 1:
               return base
           elif even(exp):
               base_to_half_exp = power(base, exp//2)
               return base_to_half_exp * base_to_half_exp
           else:[[:Image:]]
               return base * power(base, exp-1)
    print power(2, 7)

power(2, 7) 函数将多次调用 even() 函数和 power() 函数。此图显示了函数的进展。

每次函数调用另一个函数时,箭头就会从函数指向它正在调用的函数。当然,多个箭头可以从同一个函数发源。

调用树可以利用不同的约定来设计,以强调函数的不同点。如果每个函数返回的值对问题很重要,那么这些值可以放在调用树中,箭头向上指向将使用该值的函数。如果时间是最重要的,并且多个箭头起源于同一个函数,则第一个被调用的函数应该放在最左边。此外,调用树可以帮助显示函数的复杂性。考虑这个 power 函数


       def even(i): # return True iff i is an even number
           return i % 2 == 0
       def power(base, exp):
           if exp == 1:
               return base
           elif even(exp):
               return power(base, exp//2) * power(base, exp//2)
           else:
               return base * power(base, exp-1)
       print power(2, 7)

此函数形成以下调用树。

在查看调用树时很明显,原始函数的复杂性要低得多,因此速度要快得多。

华夏公益教科书