首页 > 试题广场 >

下面程序的功能是输出数组的全排列,选择正确的选项,完成其功能

[单选题]
下面程序的功能是输出数组的全排列,选择正确的选项,完成其功能。
void perm(int list[], int k, int m)
{
if (    )
{
    copy(list,list+m,ostream_iterator<int>(cout," "));
    cout<<endl;
    return;
}
for (int i=k; i<=m; i++)
{
    swap(&list[k],&list[i]);
    (    );
    swap(&list[k],&list[i]);
}
}

  • k!=m 和 perm(list,k+1,m)
  • k==m 和 perm(list,k+1,m)
  • k!=m 和 perm(list,k,m)
  • k==m 和 perm(list,k,m)
if是递归的终止判断条件,刚开始输入的时候k应该为0,m应该为数组中的元素个数;所以当k==m时,表示全排列的全部情况都已经找出。
第一个swap是依次将第k个元素和k~m个元素交换,交换完后进入递归,再全排列其子数组。
递归调用,之所以从k+1开始,是因为如果传入的是k的话,递归传进去的参数不变,递归将永无止境的递归下去,因为k永远不会等于m
第二个swap是将该层交换完后的数组再还原,目的是为了使递归返回后不改变上一层的数组元素顺序,方便下一次交换。
发表于 2016-06-15 12:46:15 回复(4)
其实这道题不需要搞清楚是在做什么,排除法都能够解决
发表于 2016-06-16 16:47:13 回复(2)