好友
阅读权限100
听众
最后登录1970-1-1
|
本帖最后由 侃遍天下无二人 于 2021-5-27 15:50 编辑
我不是特别喜欢这种表达方式,容易把人弄糊涂
首先,务必要明确的一点是,当程序输出全排列时,已经递归到n+1层
例如n=3时,输出第一个全排列的过程中,各层刚刚调用下层函数时的状态如下:
(我觉得a更像一个栈,所以多出的0就不写了)
层级 |
a |
book(各层共享) |
for循环的i值(各层独立) |
1 |
{1} |
{1,0,0,0,0,0,0,0,0,0} |
1 |
2 |
{1,2} |
{1,1,0,0,0,0,0,0,0,0} |
2 |
3 |
{1,2, 3} |
{1,1,1,0,0,0,0,0,0,0} |
3 |
问题就出在这个book是各层共享的变量,如果不将book中的值清零,当函数退回前一层的时候,状态就会是这样
层级 |
a |
book(各层共享) |
for循环的i值(各层独立) |
x |
{[x-1个数]} |
{1,1,1,0,0,0,0,0,0,0} |
? |
如果是在第1层,?在2~n(此处为3)之间,如果在其他层,?在1~n之间。
这个时候就无法向a中加入任何数了,因为所有的数看上去似乎都已经分配了
而实际上并非如此,当函数回退到上一层的时候,便是为寻找新的全排列做准备,因此其选定的数必须释放,故要将book对应处置为0.
此外,各层的i值是相互独立的,如果上层的i没发生变动,本层的i就只能增大,上层的i发生变动后,本层的i会重新计数,这就类似于数数的过程了,n=3时,相当于按3进制(逢三进一)从000数到222,自然各层i值的组合不会有重复的情况。book的作用在于过滤数字重复的情况
|
|