此文只做笔记使用,有兴趣的同学可以参考~~
写的不好,轻喷~~
递归
基本概念:递归是一种函数在执行过程中调用自身的情况,是一种空间换取时间的方法。
递归最重要的是终止条件!!!
在python中有递归深度限制,如果超出会抛出异常:RecursionError
可以手动设置递归深度:sys库的setrecursionlimit(x)方法,x为int型,手动设置递归深度限制。
这里展示递归的两种情况:
def recursion1(n): # 先输出,再递归
if n > 0:
print(n)
recursion1(n-1)
def recursion2(n): # 先递归,再输出
if n > 0:
recursion2(n-1)
print(n)
递归案例——求阶乘and汉诺塔
展示两种递归的典型应用
求阶乘
def factorial(n):
if n == 0: # 0的阶乘为1,并且当n == 0时,递归结束
return 1
else:
return n * factorial(n-1)
汉诺塔问题
汉诺塔问题是一个经典的递归问题,描述如下:
有三根柱子,标记为A、B、C,初始时在柱子A上有n个不同大小的圆盘,按照从上到下递增的顺序排列。目标是将所有圆盘从柱子A移动到柱子C,并且在移动过程中遵循以下规则:
每次只能移动一个圆盘;
大圆盘不能放在小圆盘上面。
汉诺塔问题的解决方案是通过递归算法实现的。具体步骤如下:
将上面 n-1 个圆盘从柱子A经过柱子C移动到柱子B;
将第 n 个最大的圆盘从柱子A移动到柱子C;
将 n-1 个圆盘从柱子B经过柱子A移动到柱子C。
通过递归调用上述步骤,可以解决任意数量圆盘的汉诺塔问题。
def hanoi(n, a, b, c): # n个盘子,从a柱经过b柱移动到c柱
if n > 0:
hanoi(n - 1, a, c, b) # 为了达成以上目的,先把n-1个盘子,从a柱经过c柱移动到b柱
print("从 %s 移动到 %s" % (a, c))
hanoi(n - 1, b, a, c)
代码自己手动敲一遍理解更深哦!