该程序是用递归算法实现全排列,我调试了很多遍也弄不明白perm函数else部分for循环运行脉络,请帮帮忙呀
发布网友
发布时间:2022-05-30 12:31
我来回答
共1个回答
热心网友
时间:2023-10-17 14:05
全排列的递归生成算法,应该先明白思想。
思想明白了,看程序其实不是难点。
思想如下:
就以你1,2,3为例。
它的排列是不是可以分为3中。
1开头的,2开头的,3开头的。
1开头的后面是不是又是2,3的所以排列在其后面。
所以就有了下面这个关键代码
for(int i=k;i<=m;i++)
{
swap(list[k],list[i]);
perm(list,k+1,m);
swap(list[k],list[i]);
}
初始调用的时候,k=0.perm(list,0,2);
这时候,它把每一个位置都放到第一个位置。
就相当于是分别以其开头的。
然后它递归调用后面的数生成的排列。
perm(list,k+1,m);
这是后面的数生成的排列。
swap(list[k],list[i]);
这是恢复。进行下一次交换。
其实关键思想,就是把每个元素放在第一个位置。然后加上后面的数生成全排列。
这个递归思想很重要。