汉诺塔问题

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")

你可能感兴趣的:(算法,python)