汉诺塔递归算法python
时间: 2023-11-30 08:43:09 浏览: 111
汉诺塔是一个经典的递归算法问题,其思路是将n个盘子从起始柱子通过中间柱子移动到目标柱子,保证大盘子在下面,小盘子在上面。在移动过程中,不能将大盘子放在小盘子上面。下面是汉诺塔递归算法的Python实现:
```python
def hanoi(n, start, end, mid):
if n == 1:
print(start, '->', end)
else:
hanoi(n-1, start, mid, end)
print(start, '->', end)
hanoi(n-1, mid, end, start)
```
其中,n表示盘子的数量,start表示起始柱子,end表示目标柱子,mid表示中间柱子。当n等于1时,直接将起始柱子上的盘子移动到目标柱子上;当n大于1时,先将n-1个盘子从起始柱子移动到中间柱子上,再将最后一个盘子从起始柱子移动到目标柱子上,最后将n-1个盘子从中间柱子移动到目标柱子上。
相关问题
python汉诺塔递归算法
汉诺塔问题是一个经典的递归问题,其递归思想是将大问题分解为小问题,直到问题的规模足够小,可以直接求解。下面是Python实现汉诺塔递归算法的代码:
```python
def hanio(n, start, auxiliary, end):
if n == 1:
print("将圆盘从" + start + "移动到" + end)
else:
# 1. 将n -1个圆盘从A柱(start)经过C柱(end)移动到辅助柱B(auxiliary)
hanio(n - 1, start, end, auxiliary)
# 2. 将n个圆盘从A柱(start)移动到C柱(end)
hanio(1, start, auxiliary, end)
# 3. 将n-1个圆盘从辅助柱B(auxiliary)经过A柱(start)移动到C柱(end)
hanio(n - 1, auxiliary, start, end)
hanio(3, "A", "B", "C")
```
上述代码中,hanio函数接受四个参数,分别是圆盘的数量n,起始柱子start,辅助柱子auxiliary和目标柱子end。当n等于1时,直接将圆盘从起始柱子移动到目标柱子即可;当n大于1时,需要将n-1个圆盘从起始柱子经过目标柱子移动到辅助柱子,然后将第n个圆盘从起始柱子移动到目标柱子,最后将n-1个圆盘从辅助柱子经过起始柱子移动到目标柱子。
汉诺塔问题非递归算法python
汉诺塔问题的非递归算法可以使用栈来实现。具体步骤如下:
1. 将源柱子、辅助柱子、目标柱子入栈。
2. 当栈不为空时,重复以下步骤:
a. 弹出栈顶的三个柱子,记为 A、B、C。
b. 如果 A 中只有一个盘子,则将 A 中的盘子直接移到 C 中。
c. 如果 A 中有多个盘子,则将 A 中除最上面的一个盘子外的所有盘子借助 B 移到 C 中,再将最上面的盘子直接移到 C 中。
d. 将 B、A、C 三个柱子按照顺序入栈。
下面是Python代码实现:
```python
class Stack:
def __init__(self):
self.items = []
def push(self, item):
self.items.append(item)
def pop(self):
return self.items.pop()
def is_empty(self):
return len(self.items) == 0
def hanoi(n, A, B, C):
stack = Stack()
stack.push((n, A, B, C))
while not stack.is_empty():
n, A, B, C = stack.pop()
if n == 1:
print(f"Move disk {n} from {A} to {C}")
else:
stack.push((n-1, B, A, C))
stack.push((1, A, B, C))
stack.push((n-1, A, C, B))
hanoi(3, 'A', 'B', 'C')
```
输出结果为:
```
Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C
```
阅读全文