第四题用Python怎么写的简单点
时间: 2024-12-28 18:33:15 浏览: 7
第四题是非递归实现汉诺塔问题。以下是用Python实现的一个简洁版本:
```python
def move_disks(n, source, auxiliary, target):
# 初始化三个栈,分别代表三根柱子
stack_a = list(range(n, 0, -1))
stack_b = []
stack_c = []
# 总步数
total_moves = 2**n - 1
for step in range(1, total_moves + 1):
if (step % 3 == 1):
move_disk(stack_a, stack_c, source, target)
elif (step % 3 == 2):
move_disk(stack_a, stack_b, source, auxiliary)
else:
move_disk(stack_b, stack_c, auxiliary, target)
def move_disk(source, target, src_label, tgt_label):
if not source or (target and source[-1]):
disk = target.pop()
source.append(disk)
print(f"Move disk {disk} from {tgt_label} to {src_label}")
else:
disk = source.pop()
target.append(disk)
print(f"Move disk {disk} from {src_label} to {tgt_label}")
# 示例调用
n = 3 # 盘子数量
move_disks(n, 'A', 'B', 'C')
```
### 解释
1. **初始化**:我们用三个列表 `stack_a`, `stack_b`, 和 `stack_c` 分别表示三根柱子上的盘子。初始状态下,所有的盘子都在 `stack_a` 上,按从大到小的顺序排列。
2. **总步数**:汉诺塔问题的总步数是 \(2^n - 如果 `step % 3 == 1`,则从 `source` 移动到 `target`。
- 如果 `step % 3 == 2`,则从 `source` 移动到 `auxiliary`。
- 如果 `step % 3 == 0`,则从 `auxiliary` 移动到 `target`。
4. **移动函数**:`move_disk` 函数负责实际的盘子移动操作,并打印移动步骤。
这个实现避免了递归,通过循环和简单的条件判断实现了汉诺塔问题的解决。希望这对你有所帮助!
阅读全文