已知一个数组中有n个字母,想输出这n个字母的全排列(且要求每输出一种排列就换行),例如:当数组中字母为ABC时,可输出ABC、ACB、BAC、BCA、CAB、CBA六种不同的排列。
算法的大概思想是采用递归的方法实现:定义一个函数,有两个参数,参数1为待处理的字母的数组,参数2为已确定的部分排列;函数功能是依次从参数1中取一个字母加入到参数2后面,并递归调用,若参数1数组为空,则输出参数2。
例如:要求ABC的全排列,则以参数1=数组ABC,参数2=空串来调用该函数;函数执行时,先取出A,以参数1=数组BC,参数2="A"来递归调用,然后取出B,以参数1=数组AC,参数2="B"来递归调用,最后以参数1=数组AB,参数2="C"来递归调用。若参数1=数组BC,参数2="A",则函数执行时,先以参数1=数组C,参数2="AB"来递归调用,再以参数1=数组B,参数2="AC"来递归调用。
请根据上述算法思想,写出函数的详细的伪代码(或完整的程序代码),要求输出ABCDEFG的全排列。
这个具体应该怎么实现啊?
问题补充:
先谢谢preferme的解答
那能不能说说伪代码怎么写啊
问题补充:
preferme的解答 定义的函数是三个参数的 但是我要用两个参数来实现,应该怎么写啊
问题补充:
lovewhzlq
应该怎么样来验证这个算法或程序是符合要求的啊?
问题补充:
不好意思,能不能写下伪代码啊?不知道怎么下手下,谢谢了
这样就行了
[code="java"]
import java.util.ArrayList;
import java.util.List;
public class NumTest {
public static void main(String[] args) {
String s="ABCD";//原字符串
List<String> result = list(s, "");//列出字符的组合,放入result
System.out.println(result.size());;
System.out.println(result);
}
/**
* 列出基础字符串(base)的所有组合
* @param base 以该字符串作为基础字符串,进行选择性组合。
* @param buff 所求字符串的临时结果
* @param result 存放所求结果
*/
public static List<String> list(String base,String buff){
List<String> result = new ArrayList<String>();//存放结果信息。
if(base.length()<=0){
result.add(buff);
}
for(int i=0;i<base.length();i++){
List<String> temp = list(new StringBuilder(base).deleteCharAt(i).toString(),buff+base.charAt(i));
result.addAll(temp);
}
return result;
}
}
[/code]
[code="java"]
public static void main(String[] args) {
String s="ABCD";//原字符串
List result = new ArrayList();//存放结果信息。
list(s, "", result);//列出字符的组合,放入result
System.out.println(result.size());;
System.out.println(result);
}
/**
* 列出基础字符串(base)的所有组合
* @param base 以该字符串作为基础字符串,进行选择性组合。
* @param buff 所求字符串的临时结果
* @param result 存放所求结果
*/
public static void list(String base,String buff,List<String> result){
if(base.length()<=0){
result.add(buff);
}
for(int i=0;i<base.length();i++){
list(new StringBuilder(base).deleteCharAt(i).toString(),buff+base.charAt(i),result);
}
}
[/code]
朋友,算法你都想好了,实现应该就是最简单的事了
像算法这种东西,说去验证它也不是说很具体的一件事,
写个单元测试,去一些数据进行测试,看看是否正确,