1、请用Python给出使用循环实现全排列的算法,比较递归与循环求解全排列的异同。 2. 请用Python给出汉诺塔问题的递归算法,要求每次只能移动一个盘片,且移动过程中大的盘片不能在小盘片上面。 (1) 如果有 3 个在 A 柱的盘片,请画出每一个盘片的移动过程。 (2) 采用代码 31 求解 3 个盘片的汉诺塔问题时,画出计算机调用各个函数的过程。
时间: 2024-01-22 17:21:35 浏览: 89
1. 使用循环实现全排列的算法
```python
def permute(nums):
n = len(nums)
res = []
used = [False] * n
path = []
def backtrack(nums, used, path):
if len(path) == n:
res.append(path[:])
return
for i in range(n):
if used[i]:
continue
used[i] = True
path.append(nums[i])
backtrack(nums, used, path)
used[i] = False
path.pop()
backtrack(nums, used, path)
return res
```
递归与循环求解全排列的异同:
异:递归是通过函数调用自身来实现的,而循环是通过循环语句来实现的。
同:两者都可以用来求解全排列问题。
2. 汉诺塔问题的递归算法
```python
def hanoi(n, a, b, c):
if n == 1:
print("move from", a, "to", c)
else:
hanoi(n-1, a, c, b)
print("move from", a, "to", c)
hanoi(n-1, b, a, c)
```
(1) 当有 3 个在 A 柱的盘片时,移动过程如下:
```
move from A to C
move from A to B
move from C to B
move from A to C
move from B to A
move from B to C
move from A to C
```
(2) 求解 3 个盘片的汉诺塔问题时,计算机调用各个函数的过程如下:
```
hanoi(3, 'A', 'B', 'C') -> hanoi(2, 'A', 'C', 'B') -> hanoi(1, 'A', 'B', 'C') -> move from A to C
hanoi(2, 'A', 'C', 'B') -> hanoi(1, 'A', 'C', 'B') -> move from A to B
hanoi(2, 'A', 'C', 'B') -> hanoi(1, 'C', 'A', 'B') -> move from C to B
hanoi(3, 'A', 'B', 'C') -> move from A to C
hanoi(3, 'A', 'B', 'C') -> hanoi(2, 'C', 'A', 'B') -> hanoi(1, 'C', 'B', 'A') -> move from C to A
hanoi(2, 'C', 'A', 'B') -> hanoi(1, 'C', 'A', 'B') -> move from C to B
hanoi(3, 'A', 'B', 'C') -> move from B to C
```
阅读全文