剑指Offer 10- I. 斐波那契数列(Easy)/ 842. 将数组拆分成斐波那契序列(Medium)/【3、4柱】汉诺塔问题(Easy)/ 306.【判断】累加数(Medium)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

class Solution:
    ### 1113 循环求余(40 ms,13.5 MB)
    def fib(self, n: int) -> int:           
        a, b = 0, 1           # 初始条件
        for _ in range(n):    # 循环求余
            a, b = b, a+b
        return a % 1000000007

汉诺塔问题

在这里插入图片描述

class Solution:
    def hanota(self, A: List[int], B: List[int], C: List[int]) -> None:
        """
        Do not return anything, modify C in-place instead.
        """
        n = len(A)
        self.move(n, A, B, C)

    # 定义move 函数移动汉诺塔
    def move(self, n, A, B, C):
        if n == 1:
            C.append(A[-1])
            A.pop()
            return 
        else:
            self.move(n-1, A, C, B)  # 将A上面n-1个通过C移到B
            C.append(A[-1])          # 将A最后一个移到C
            A.pop()                  # 这时,A空了
            self.move(n-1,B, A, C)   # 将B上面n-1个通过空的A移到C

在这里插入图片描述

  • 3柱汉诺塔公式移动次数 = 2 ** n - 1
  • 3柱汉诺塔(打印移动路径 & 统计移动次数)
ls = []

def hanoi(n, from_tower, to_tower, aux_tower):
    """
    :param n: 盘子数量
    :param from_tower: 起始塔
    :param to_tower: 目标塔
    :param aux_tower: 辅助塔
    """
    if n == 1:
#         print(f"Move disk 1 from {from_tower} to {to_tower}")
        ls.append(1)
        
        return
    
    # 先从A移动到B,此时将C作为辅助柱子
    hanoi(n-1, from_tower, aux_tower, to_tower)
    
#     print(f"Move disk {n} from {from_tower} to {to_tower}")
    ls.append(1)
    
    # 再从B移动到C,此时将A作为辅助柱子
    hanoi(n-1, aux_tower, to_tower, from_tower)

n = 4 # 盘子数量
hanoi(n, 'A', 'C', 'B')

len(ls) # 计算移动次数
def hanoi4(n):
    mem = [0] * (n + 1)
    
    # 递归函数
    def fun(m):
        if mem[m]:
            return mem[m]
        
        move = 2 ** m - 1 # 由3柱汉诺塔公式设置而来
        for x in range(1, m):
        	# 这里需要考虑最少的移动次数
            move = min(move, 2 * f(x) + 2 ** (m - x) - 1)
        
        mem[m] = move
        
        return move
    
    return fun(n)

n = 3
res = hanoi4(n)
print(res)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值