一道递归思想的排列组合题目

题目原题:任意数字序列“12345678”之类,输出它们所有的排列组合

这道题目对于学习递归还是挺不错的,可以借鉴一下

代码如下:


import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;

public class Test {
    //待排列的字符串。
    static String toBeArranged ="12345678";                
    //将其转换成字符数组。
    static String[] array =stringToStringArray(toBeArranged);
    //字符串长度。
    static int length=array.length;       
    //存放数组时计数。             
    static int k=0;   
    //result是存储计算结果的数组,其大小为length的阶乘。                         
    static String[] result=new String[total(length)];        
    //主函数,调用方法并输出结果
    public static void main(String[] args)  
    {
      //调用主要方法
      listAll(Arrays.asList(array), "");
      //输出
      System.out.println(Arrays.toString(result));        
    }
    //主要的计算方法。
    public static void listAll(List candidate, String prefix) 
    {
      if(prefix.length()==length)                //小于字符串长度的组合忽略。
      {
          result[k++]=prefix;                //存放数组里。
      }
      for(int i=0;i<candidate.size();i++)
             {
          List tmp = new LinkedList(candidate);
          {
              listAll(tmp, prefix + tmp.remove(i));    //函数中的参数从右边开始解析
          }
      }
    }
    //将字符串转成数组。
    static String[] stringToStringArray(String s)
    {
      int length=s.length();
      if(length<=0)
      {
          return new String[0];
      }
      String[] result=new String[length];
      for(int i=0;i<length;i++)
      {
          result[i]=""+s.charAt(i);
      }
      return result;
    }
    //计算number阶乘,为结果数组的容量。
    static int total(int number)       
    {
      int number1=1;
      for(int i=1;i<=number;i++)
      {
          number1*=i;
      }
      return number1;
    }   
    }

注意的几点:

public Object remove()
作用是移除LinkedList对象的第一个元素..
返回的是被移除的那个元素.

public Object remove(int index);
作用是移除LinkedList对象中索引号为index的元素..
返回的是被移除的那个元素.

public boolean remove(Object o)
作用是移除LinkedList对象中值为o的元素..
移除成功返回true,否则返回false

也就是说在代码中的tmp.remove(i)),其用意是删除tem[i]的同时并获取到它的值
且因为list是有顺序的,所以在删除对象之后,排在其后的对象下标都减1,保持了序列的连贯。
除了主方法逻辑比较难理解一点,其余的代码应该都不难。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值