1. 使用递归函数生成排列
// output all permutations of n elements
# include <iostream>
using namespace std;
template<class T>
void Perm(T list[], int k, int m)
{// Generate all permutations of list[k:m].
int i;
if (k == m) {// list[k:m] has one permutation, output it
for (i = 0; i <= m; i++)
cout << list[i];
cout << endl;
}
else // list[k:m] has more than one permutation
// generate these recursively
for (i = k; i <= m; i++) {
Swap(list[k], list[i]);
Perm(list, k+1, m);
Swap(list[k], list[i]);
}
}
template<class T>
inline void Swap(T& a, T& b)
{// Swap a and b.
T temp = a; a = b; b = temp;
}
int main()
{
char a[] = {'1', '2', '3', '4'};
int n = 3;
cout << "The permutations of 123 are" << endl;
Perm(a, 0, n-1);
cin.get();
return 0;
}
java、、
package datastructure;
import java.util.*;
public class Perm {
public void range(int[] a,int k,int m)
{
int i;
if(k==m)
{
for( i=0;i<=m;i++)
System.out.print(a[i]);
System.out.println();
}
else{
for(i=k;i<=m;i++)
{
//tem=a[i];
//a[i]=a[k];
//a[k]=tem;
exchange(a,k,i);
//这里与C++不同,因为C++那调用了引用,java不是,如果只传入a[i]a[k],对int[] a,数组内部根本没有
//达到对调两个数的目的,只有连数组一起传进去~~~~~~~
range(a,k+1,m);
exchange(a,k,i);
//tem=a[i];
//a[i]=a[k];
//a[k]=tem;
}}
}
public void exchange(int[] arr,int c,int d)
{
int tem;
tem=arr[c];
arr[c]=arr[d];
arr[d]=tem;
}
public static void main(String[] args)
{
System.out.println("How many numbers do you want to arrange?INPUT!");
Scanner in=new Scanner(System.in);
int n=in.nextInt();
int[] a=new int[n];
for(int i=0;i<a.length;i++)
a[i]=i+1;
Perm pe=new Perm();
pe.range(a, 0,a.length -1);
}
}
2 试编写一个递归函数,用来输出n 个元素的所有子集。例如,三个元素{a, b, c} 的所有子集是:{ }(空集) ,{a}, {b}, {c}, {a, b}, {a, c}, {b, c} 和{a, b, c}。
#include<stdio.h>
/*课后习题里有个求子集的算法,要求用递归
比如:S={a,b,c,d}要求打印出S的所有子集包括空集
我就胡乱写了个,结果相差很大
*/
// 组合+遍历
char ch[100];
void print(int n)
{
int i;
printf("{");
for(i=0;i<n;i++)
if(i!=n-1)
printf("%c, ",ch[i]);
else
printf("%c",ch[i]);
printf(" } \n");
return ;
}
void dfs(int n,int index,int hou)
{
char i;
if(n==index)
{
print(index);
return ;
}
for(i=hou;i<4;i++)
{
ch[n]=i+'a';
// if(n<index)
dfs(n+1,index,i+1);
}
}
int main()
{
int i;
for(i=0;i<=4;i++)
dfs(0,i,0);
return 0;
}