Python 复杂的尾调用优化,可以用递归的形式定义斐波那契数列。第 n 个斐波那契数 的计算公式如下:
将斐波那契数 定义为其前面两个数的和 +:。这是多次递归的典型例子,无法用简单的尾递归优化进行转换。但如果不把它优化成尾递归,计算速度会慢到基本不可用。
下面是个简单的实现:
由于是多次递归,当需要计算fib(n)
时,必须先算出fib(n - 1)
和fib(n - 2)
。由于计算fib(n - 1)
时重复计算了一次fib(n - 2)
,导致斐波那契函数的实际计算增加了一倍。
Python是从左向右依次对表达式求值的,最大可以计算fib(1000)
,但实际计算这么大的数需要非常有耐心。
下面改写整个算法,用有状态的变量代替递归。
这里的有状态版本从0向上计算,而不像递归版本从 向下计算,速度会比递归版本快得多。
需要强调的是,对fib()
函数的递归优化没有简便方法。为了能用命令式版本代替递归版本,必须结合具体算法,确定所需中间变量的数量。