一个函数在其定义中调用自身的方法即为递归( recursion)。构成递归需要满足两个条件,第一个是子问题与父问题存在同样的处理逻辑,第二个就是要有递归出口—化简为非递归处理方式。
在某些场景下,使用递归,不仅可以大大减少程序的代码量,而且问题也会变得极其简单。
需要注意的是:每一次函数的调用都涉及到一个桢栈的入栈到出栈,同时,会涉及到分配内存空间,保存参数,返回地址和临时变量,而且往栈里压入数据和弹出都需要时间,所以当递归的层数越大时,对服务器的内存消耗也越大,而程序的运行时间也越长。
举个栗子:
汉诺塔问题使用递归求解及其方便。
#!/usr/bin/env python3
# -*- coding:utf-8 -*-
def han_tower(n,x,y,z):
if n == 1:
print("move: ",x," --> ",z)
else:
han_tower(n-1,x,z,y) # 将n-1层移动到y上面
han_tower(1,x,y,z) # 将最下面一层移动到z上面
han_tower(n-1,y,x,z) # 将n-1层从y上面移动到z上面
number = int(input("请输入汉诺塔的层数: "))
han_tower(number,"a","b","c")