如何用Array实现纸牌魔术的交替取牌放牌逻辑?
纸牌魔术序列模拟实现
需求说明
- 魔术规则:重复执行「将牌堆第一张移到牌堆底部,把第二张放到桌面」的操作,直到所有牌都放到桌面
- 使用给定的
Q_kort数组时,最终桌面的出牌顺序必须是1、2、3……13 - 必须使用Python的
array模块完成
原错误代码
from array import array Q_kort = array("i", [7, 1, 12, 2, 8, 3, 11, 4, 9, 5, 13, 6, 10]) class Kort: def __init__(self, Q_kort): self.__Q_kort = Q_kort def enqueue(self, x): sist = self.__Q_kort.append(x) return sist def dequeue(self): forst = self.__Q_kort.pop(0) return forst def magic(): kort = Kort(Q_kort) for element in Q_kort: kort.dequeue() kort.enqueue(element) print(element) magic()
问题分析
- 原代码的
for循环直接遍历原数组元素,未考虑操作过程中队列长度的动态变化,导致循环次数与操作逻辑不匹配 - 错误地对每个元素执行「出队+入队+打印」,完全不符合魔术规则的“移一张、出一张”逻辑
修正实现
核心逻辑是循环处理队列直到清空:
- 每次循环先将队首元素移到队尾(模拟把第一张牌放到牌堆底部)
- 然后取出队首元素(模拟放到桌面)
- 当队列只剩最后一张牌时,直接取出即可,无需再移队尾
from array import array Q_kort = array("i", [7, 1, 12, 2, 8, 3, 11, 4, 9, 5, 13, 6, 10]) class Kort: def __init__(self, q_array): self.__queue = q_array def enqueue(self, item): self.__queue.append(item) def dequeue(self): if not self.is_empty(): return self.__queue.pop(0) return None def is_empty(self): return len(self.__queue) == 0 def size(self): return len(self.__queue) def magic(): kort_deck = Kort(Q_kort.copy()) # 复制原数组避免修改原始数据 result = [] while not kort_deck.is_empty(): if kort_deck.size() > 1: # 只剩一张牌时无需移到队尾 moved_card = kort_deck.dequeue() kort_deck.enqueue(moved_card) # 取出当前队首放到桌面 desk_card = kort_deck.dequeue() result.append(desk_card) print(desk_card, end=" ") print("\n最终出牌顺序是否符合要求:", result == list(range(1,14))) magic()
运行结果
运行后会依次输出:1 2 3 4 5 6 7 8 9 10 11 12 13,并验证顺序符合要求。
内容的提问来源于stack exchange,提问作者David Gallego
相关产品推荐
相关产品推荐

