1、请给出使用循环实现全排列的算法,比较递归与循环求解全排列的异同。 2. 汉诺塔问题的递归算法,要求每次只能移动一个盘片,且移动过程中大的盘片不能在小盘片上面。 (1) 如果有 3 个在 A 柱的盘片,请画出每一个盘片的移动过程。 (2) 采用代码 31 求解 3 个盘片的汉诺塔问题时,画出计算机调用各个函数的过程。运用python写出代码,并写出实验小结
时间: 2024-02-15 22:02:28 浏览: 113
1. 使用循环实现全排列的算法
```python
def permutation(nums):
n = len(nums)
index = [0] * n
res = []
i = 0
while i < n:
if index[i] < i:
if i % 2 == 0:
nums[0], nums[i] = nums[i], nums[0]
else:
nums[index[i]], nums[i] = nums[i], nums[index[i]]
res.append(nums[:])
index[i] += 1
i = 0
else:
index[i] = 0
i += 1
return res
```
递归求解全排列的算法:
```python
def permutation(nums, start, end, res):
if start == end:
res.append(nums[:])
else:
for i in range(start, end):
nums[start], nums[i] = nums[i], nums[start]
permutation(nums, start+1, end, res)
nums[start], nums[i] = nums[i], nums[start]
```
异同点:
- 递归实现的代码比较简洁,但是对于大规模数据,递归的内存开销比较大,容易导致栈溢出;
- 循环实现的代码比较复杂,但是对于大规模数据,循环实现的效率比递归更高。
2. 汉诺塔问题的递归算法
```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)
```
(1) 如果有 3 个在 A 柱的盘片,请画出每一个盘片的移动过程。
```
1 --> 3
1 --> 2
3 --> 2
1 --> 3
2 --> 1
2 --> 3
1 --> 3
```
(2) 采用代码求解 3 个盘片的汉诺塔问题时,调用过程如下:
```
hanoi(3, 'A', 'C', 'B')
hanoi(2, 'A', 'B', 'C')
hanoi(1, 'A', 'C', 'B')
1 --> 2
1 --> 3
hanoi(1, 'C', 'B', 'A')
2 --> 3
1 --> 2
hanoi(2, 'B', 'C', 'A')
hanoi(1, 'B', 'A', 'C')
1 --> 2
2 --> 3
hanoi(1, 'A', 'C', 'B')
2 --> 3
1 --> 3
```
实验小结:
本次实验学习了递归和循环算法的异同点,以及递归算法的内存开销问题。同时,我们还学习了汉诺塔问题的递归算法,并通过代码和调用过程的分析来加深理解。在编写代码时,我们需要注意代码的可读性和效率,并且需要注意边界条件和特殊情况的处理。
阅读全文