hx1997
2014-11-01 19:07:56 +08:00
竟然看懂了hhh
我们把这个函数简称为 P(n, A, cur),以全排列 1 2 3 为例。递归过程是这样的:
P(3, A, 0)
→ P(3, A, 1)
→ → P(3, A, 2)
→ → → P(3, A, 3)
对吧。那么呢,在执行到 P(3, A, 3) 的时候自然就会打印出第一个排列 1 2 3,打印完成后就回到了 P(3, A, 2) 的 else for 这里,这时会 i++ 变成 4 > n(注意是 P(3, A, 2) 中的 i),于是退出循环,再回到 P(3, A, 1) 的 else for 这里,这时会 i++ 变成 3(注意是 P(3, A, 1) 中的 i),于是 A[1] == 3,接着 P(3, A, 2) 再决定 A[2] == 2,再接着 P(3, A, 3) 打印 1 3 2。
回到问题上
1.在枚举完成、输出第一个排列之后,程序如何工作呢?没有 else 条件可以递归到下一次什么的。
→ 见上,利用递归性质以及循环。
2.其实我偷偷的把代码打了一遍……可是 a 是个全局数组,输出一次之后就没有什么再次重置的操作么……
→ 因为决定完 1 2 3 后会退回到第二个的位置(递归),这时循环将 i++ 变成 3,于是就把第二位的 2 覆盖掉了,不需要重置。
3.检查此次输入与此次前面已经确认的数字里面无重复这个操作我看出来了,可是是如何实现,比如上次输出的排列是 1 2 3 ,这次就应该是 1 3 2 这次如何判断第二位要用 2 而非 3 的?
→ 见上,利用递归性质以及循环。
感觉还是没讲明白==