一、时间复杂度
普遍求解思路:
1、确定问题的规模:n
2、若有循环减半问题:logn
3、若有k层关于n的循环:n的k次方
二、空间复杂度
普遍求解思路:
算法使用了几个变量:O(1)
算法使用了长度为n的一维列表:O(n)
算法使用了m行n列的二维列表:O(mn)
三、递归
递归的两个特点:
1、调用自身
2、结束条件
递归汉诺塔问题:
n个圆盘,三座塔,称为起始塔A,目标塔B,辅助塔C
对汉诺塔问题的求解过程如下:
第一步:
1、将n-1个圆盘由起始塔A经过目标塔B移动到辅助塔C上;
2、将第n个圆盘(最大的圆盘)由起始塔A移动到目标塔B上;
第二步:
1、将n-1个圆盘由辅助塔C经过起始塔A移动到目标塔B上;
代码实现如下:
i = 1
def Hanoi(n, S, T, A):
global i
if n == 1:
print(f"第{i}步:{S} -> {T}")
i += 1
else:
#将n-1层,由起始塔经目标塔移动到辅助塔
Hanoi(n-1, S, A, T);
#将最大的圆盘由起始塔移动到目标塔
print(f"第{i}步:{S} -> {T}")
i += 1
#将n-1层,由辅助塔经起始塔移动到目标塔
Hanoi(n-1, A, T, S)
Hanoi(4, 'A', 'C', 'B')
运行结果如下:
第1步:A -> B
第2步:A -> C
第3步:B -> C
第4步:A -> B
第5步:C -> A
第6步:C -> B
第7步:A -> B
第8步:A -> C
第9步:B -> C
第10步:B -> A
第11步:C -> A
第12步:B -> C
第13步:A -> B
第14步:A -> C
第15步:B -> C
附上一张偷的图,帮助大家理解一下
图中可以看到,中间的Move(A,C)是将A中最大的圆环放入C中。
上半部分是将n-1层移动到辅助塔
下半部分是将n-1层移动到目标塔
但二者递归并不在同一层级。