递归算法:
递归有几个关键词:无限,调用,自身
什么是递归算法,其核心思想是:原始问题可以分解为规模更小的子问题,子问题可以继续分解为规模更小的子问题,一层一层分解下去。在一定的递归终止条件下求解出最内层的子问题,再一层一层返回,最终思想的原始问题的解
递归调用:
递归的调用可以分两种:直接递归和间接递归。
直接递归:直接递归很好理解,就是在函数内直接调用自己
间接递归:间接递归则是先调用其他函数。通过其他函数的调用在回到自身上来
一个简单的案例,用递归函数来计算阶乘:
def factorial(n):
if n == 0 or n == 1:
return 1
else:
return n * factorial(n-1)
print(factorial(5)) # 输出: 120
代码解释:
使用递归算法解决汉诺塔问题:
def hanoi(n, source, target, auxiliary):
"""
解决汉诺塔问题
:param n: 圆盘的数量
:param source: 源柱子
:param target: 目标柱子
:param auxiliary: 辅助柱子
"""
if n == 1:
# 如果只有一个圆盘,直接移动到目标柱子
print(f"Move disk 1 from {source} to {target}")
return
# 将n-1个圆盘从源柱子移动到辅助柱子
hanoi(n-1, source, auxiliary, target)
# 将最大的圆盘从源柱子移动到目标柱子
print(f"Move disk {n} from {source} to {target}")
# 将n-1个圆盘从辅助柱子移动到目标柱子
hanoi(n-1, auxiliary, target, source)
hanoi(3, 'A', 'C', 'B')
总结:
递归算法需满足3个条件:
1:原始问题可以分解为多个规模更小的子问题
2:分解后的子问题除了规模不同,求解思路完全一样
3:这个递归必须存在一个终止条件,以免进入一个死循环