用递归的思想输出一个数组的全排列,和组合

来源:互联网 发布:淘宝麦迪黑莓手机网店 编辑:程序博客网 时间:2024/06/01 10:33
 http://blog.sina.com.cn/s/blog_9f1c0931010199gw.html
1.全排列:用递归的思想求出全排列
#include "stdafx.h"
#include <iostream>
using namespace std;
 void swap(int &a,int &b)//交换连个元素
 {
     int tem;
     tem = a;
     a = b;
     b = tem;
 }
 void cal(int *a,int first,int length)
 {
     if(first == length)//如果递归到深层时,到最后交换的元素即时最后一个元素时就打印出来
     {
         for(int i = 0; i <= length; i++)
         cout<<a[i]<<" ";
         cout<<endl;
     }
     else
     {
         for(int i = first; i <= length; i++)
         {//循环遍历使得当前位置后边的每一个元素都和当前深度的第一个元素交换一次
             swap(a[first],a[i]);//使得与第一个元素交换
             cal(a,first+1,length);//深入递归,此时已确定前边的元素,处理后边子序列的全排列形式。
             swap(a[first],a[i]);//恢复交换之前的状态
         }
     }
 }
 int main()
 {
     int a[6] = {1,2,3,4,5,6};
     cal(a,0,5);
     return 0;
 }

2.借助于上面的求出全排列的方法,求组合的时候只是在递归到低时输出的不一样,这里只输出组合个数的元素:
#include "stdafx.h"
#include <iostream>
using namespace std;
 void swap(int &a,int &b)//交换连个元素
 {
     int tem;
     tem = a;
     a = b;
     b = tem;
 }
 void cal(int *a,int first,int length,int r)
 {
     if(first == length)//如果递归到深层时,到最后交换的元素即时最后一个元素时就打印出来
     {
         for(int i = 0; i <= r; i++)
         cout<<a[i]<<" ";
         cout<<endl;
     }
     else
     {
         for(int i = first; i <= length; i++)
         {//循环遍历使得当前位置后边的每一个元素都和当前深度的第一个元素交换一次
             swap(a[first],a[i]);//使得与第一个元素交换
             cal(a,first+1,length,r);//深入递归,此时已确定前边的元素,处理后边子序列的全排列形式。
             swap(a[first],a[i]);//恢复交换之前的状态
         }
     }
 }
 int main()
 {
int a[6] = {1,2,3};
     cal(a,0,2,1);
     return 0;
 }
原创粉丝点击