汉诺塔问题

def hanota(A: List[int], B: List[int], C: List[int]) -> None:
    """
    Do not return anything, modify C in-place instead.
    """
    length = len(A)
    # 思路:通过中间的跳转,每次实现
    def traceback(n, src, tmp, target):
        if n == 1:
            target.append(src.pop())
            return

        traceback(n - 1, src, target, tmp) #  1、以target为中间过度,把 src 的n-1放到 tmp
        target.append(src.pop()) # 2、把src 的最大元素放到 target
        traceback(n - 1, tmp, src, target) # 3、以src为中间过度,把 tmp 的所有元素放到 target
    traceback(length, A, B, C)

A = [4, 3, 2, 1, 0]
C = []
hanota(A, [], C)
print(A, C)

核心思想: 

def traceback(n, src, tmp, target):
    if n == 1:
        print(f"{src} -({n}> {target}")
        return
    
    # 1、以C为中间过度,把A的n-1放到B
    # 2、把A的最大元素放到C
    # 3、以A为中间过度,把B的所有元素放到C
    
    traceback(n - 1, src, target, tmp)
    print(f"\t{src} -({n})> {target}")
    traceback(n - 1, tmp, src, target)

traceback(4, "A", "B", "C")

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值