Python数据结构与算法 算法基础1

一、时间复杂度        

        普遍求解思路:

                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层移动到目标塔

但二者递归并不在同一层级。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值