解决递归问题的关键在于寻找递归的结构。
寻找一个可递归问题的递归结构,不仅可以直观地转换为程序语言,进行问题的求解,而且也为我们人脑对问题的求解提供思路,比如3阶的汉诺塔,我们还可简单设计方案,倘若四阶、五阶甚至更高阶,有了对递归的认识,我们便有了求解问题的套路。
比如斐波那契数列的递归结构是什么:
f(n)=f(n−1)+f(n−2)
从数学语言向程序语言:
def fib(n):
return n if n <= 1 else fib(n-1)+fib(n-2)
整数的幂指数
an
:
an=a×an−1f(n)=a×f(n−1)
从数学语言向程序语言:
def power(a, n):
return a if n == 1 else a*power(a, n-1)
n
阶汉诺塔的递归结构又是什么呢?我们可将 1
),和最下的
1
个圆盘,也即:
我们便将一个 n 阶的汉诺塔问题,变成了类似二阶的问题。
def hanoi(n, fromStack, toStack, spareStack):
if n == 1:
print('move disk from', fromStack, 'to', toStack)
else:
hanoi(n-1, fromStack, spareStack, toStack)
hanoi(1, fromStack, toStack, spareStack)
hanoi(n-1, spareStack, fromStack, toStack)
if __name__ == '__main__':
hanoi(3, 'a', 'b', 'c')
汉诺塔问题递归求解的时间复杂度分析
时间复杂度为: O(2n) ,指数级(exponential);