【发布时间】:2019-04-16 22:38:46
【问题描述】:
我真的很难理解递归代码。我复制了一段我试图理解的代码。我已经看到以图形方式描述了这一点,但我不明白程序如何得到结果。
这是我目前的理解
最初
- (ABC, 0, 3) 被传入函数
- 如果条件不满足,那么进入 ELSE 分支
- j 为 0,这次 i 为 0(将第一个字符与第一个字符交换 字符)
- **THEN* 将新的“数据”发送回函数并重新运行问题
- 为什么“j”会随着 i 增加? for 循环还没有运行到完成无论如何....由于某种原因 j 和 i 都增加了 直到 i = 3 然后打印“ABC”
- 到目前为止,我们还没有超出 line permute(data, i+1, length)
- 我不明白为什么程序在打印“ABC”行后会跳转到 permute(data...) 行,我们在 “if-else”子句的“IF”而非“ELSE”分支。
- 然后我不明白我们如何在所有字符之间使用 “i”和“j”。
这有意义吗? 请有人能解释一下这段代码是如何产生所有解决方案的。谢谢
def permute(data, i, length):
if i==length:
print(''.join(data) )
else:
for j in range(i,length):
#swap
data[i], data[j] = data[j], data[i]
permute(data, i+1, length)
data[i], data[j] = data[j], data[i]
string = "ABC"
n = len(string)
data = list(string)
permute(data, 0, n)
【问题讨论】:
-
理解递归的最好方法是假装它没有发生。想想单独的(“意外地”同名的)例程来完成所有的工作。更简单?
-
尽管这不是一个特别深的递归,但这个函数远非学习递归如何工作的好候选。该函数不是通过递归调用“重新运行”,而是在在现有实例之上运行该函数的一个新实例。这个函数调用的stacking被称为......嗯......堆栈。当 if 语句的计算结果为 True 时,我们将其称为递归函数的 基本情况,它退出,然后调用它的函数的实例继续运行直到完成,然后在堆栈中向下.我推荐一种不同的算法。