Java递归电话号码字母

Java递归电话号码字母,java,recursion,Java,Recursion,如何使用递归方法编写java程序,该方法接收“234”这样的int,并将其转换为手机键盘上相应的字母(2=ABC、3=DEF等),然后打印出其排列?e、 g: 输入=234 输出=ADG ADH ADI AEG AEH AEI AFG AFH AFI BDG BDH BDI BEG BEG BFG BFH BFI CDG CDH CDI CEG CEH CEI CFG CFH CFI 输入=89 输出=TW TX TY TZ UX UY UZ VW VX VY VZ 获取输入,转换为字符串 调

如何使用递归方法编写java程序,该方法接收“234”这样的int,并将其转换为手机键盘上相应的字母(2=ABC、3=DEF等),然后打印出其排列?e、 g:

输入=234

输出=ADG ADH ADI AEG AEH AEI AFG AFH AFI BDG BDH BDI BEG BEG BFG BFH BFI CDG CDH CDI CEG CEH CEI CFG CFH CFI


输入=89

输出=TW TX TY TZ UX UY UZ VW VX VY VZ

  • 获取输入,转换为字符串

  • 调用函数生成(字符串前缀、字符串后缀),前缀为空,输入转换为后缀

  • 在generate()内部,从后缀中删除第一个数字,将其映射到对应字母的数组,并递归地为数组中的每个字母调用generate(),将其附加到前缀

  • 获取输入,转换为字符串

  • 调用函数生成(字符串前缀、字符串后缀),前缀为空,输入转换为后缀

  • 在generate()内部,从后缀中删除第一个数字,将其映射到对应字母的数组,并递归地为数组中的每个字母调用generate(),将其附加到前缀


  • 单独生成排列将构成一个很好的家庭作业,更不用说强制递归和电话号码干扰了

    通过类似于的方法,可以有效地生成少量置换。n个元素的序列有n!置换(假设全画,每个置换也由n个元素组成)。请注意,对于双元素序列,有两种排列:

    • 原始序列,以及
    • 这两个元素互换了
    对于三元素序列,有六种排列:

    • 下面两个元素的排列,然后
    • 将序列向右(或向左)旋转一个单元格,然后
    • 下面两个元素的排列,然后
    • 将序列向左(或向右,与上面相反)旋转一个单元格,然后
    • 底部两个元素的排列
    也就是说,它是两个元素的版本,执行了三次,中间有两次转换。现在,一个四元素序列有24个排列:

    • 下面三个元素的排列,然后
    • 保存位置1,将0指定给1,将3指定给0,将保存的值指定给3,然后
    • 下面三个元素的排列,然后
    • 交换位置0和2,交换位置1和3(或向右旋转2),以及
    • 下面三个元素的排列,然后
    • 保存位置3,将2指定给3,将0指定给2,将保存的值指定给0,然后
    • 底部三个元素的排列
    你开始看到一种模式了吗?注意解决方案的递归性质

    在上述四个要素中,模式更难识别。您可以遍历序列,将所选元素与最后一个元素交换,反转序列,每次扩展底部24个排列

    试着把它写在纸上,记录下你洗牌元素的步骤,你会发现你已经编写了你需要的程序


    还要注意,这里发布的大多数解决方案都使用type
    String
    ,并不断地将其切碎并重新组装<代码>字符串是一个糟糕的选择,因为它是不可变的,当生成置换时,最好通过交换和旋转向量(实际上是一个环)中的元素来完成


    这是一种罕见的情况,您实际上必须将字母写入目标流,因此请将您的解决方案与该操作进行对比。使用一个字符数组,并在发出特定排列时将字符逐个写入流。形成一个字符串只是为了将条目转储到流中,这涉及到不必要的分配和复制。

    仅生成排列将构成一个很好的家庭作业,更不用说强制递归和电话号码干扰了

    通过类似于的方法,可以有效地生成少量置换。n个元素的序列有n!置换(假设全画,每个置换也由n个元素组成)。请注意,对于双元素序列,有两种排列:

    • 原始序列,以及
    • 这两个元素互换了
    对于三元素序列,有六种排列:

    • 下面两个元素的排列,然后
    • 将序列向右(或向左)旋转一个单元格,然后
    • 下面两个元素的排列,然后
    • 将序列向左(或向右,与上面相反)旋转一个单元格,然后
    • 底部两个元素的排列
    也就是说,它是两个元素的版本,执行了三次,中间有两次转换。现在,一个四元素序列有24个排列:

    • 下面三个元素的排列,然后
    • 保存位置1,将0指定给1,将3指定给0,将保存的值指定给3,然后
    • 下面三个元素的排列,然后
    • 交换位置0和2,交换位置1和3(或向右旋转2),以及
    • 下面三个元素的排列,然后
    • 保存位置3,将2指定给3,将0指定给2,将保存的值指定给0,然后
    • 底部三个元素的排列
    你开始看到一种模式了吗?注意解决方案的递归性质

    在上述四个要素中,模式更难识别。您可以遍历序列,将所选元素与最后一个元素交换,反转序列,每次扩展底部24个排列

    试着把它写在纸上,记录下你洗牌元素的步骤,你会发现你已经编写了你需要的程序


    还要注意,这里发布的大多数解决方案都使用type
    Stringimport java.util.ArrayList;
    
    class PhoneNumbers
    {
        public static void main(String[] args)
        {
            for (String result: convert(args[0]))
                System.out.println(result);
        }
    
        public static ArrayList<String> convert(String phoneNumber)
        {           
            int digit = Integer.parseInt(phoneNumber.substring(0, 1));
            String letters = new String[] {
                "0",
                "1",
                "ABC",
                "DEF",
                "GHI",
                "JKL",
                // etc...
            }[digit];
    
            ArrayList<String> result = new ArrayList<String>();
    
            for (int i = 0; i < letters.length(); ++i) {
                char letter = letters.charAt(i);
                if (phoneNumber.length() > 1) {
                    for (String rest: convert(phoneNumber.substring(1)))
                        result.add(letter + rest);
                } else {
                    result.add("" + letter);
                }
            }
    
            return result;
        }
    }
    
    ADG
    ADH
    ADI
    AEG
    AEH
    AEI
    AFG
    AFH
    AFI
    ...
    
    String[] allLetters = new String[] {
                    "0",
                    "1",
                    "ABC",
                    "DEF",
                    "GHI",
                    "JKL",
                    // etc...
            };
    
    public static void convert(String phoneNumber)
    {
      convertSubstring(phoneNumber,"");
    }
    
    private static void convertSubstring(String phoneNumber, String convertedLetters)
    {                   
      int digit = Integer.parseInt(phoneNumber.substring(0, 1));
      String letters=allLetters[digit];
      String remainingString=phoneNumber.substring(1);
    
      for (int i = 0; i < letters.length(); ++i) 
      {
         char letter = letters.charAt(i);
         String result=convertedLetters+letter;
         if (remainingString.length()==0)
            System.out.println(result);
         else
            convertSubstring(remainingString, result);
      }
    }
    
    public class printKeypad {
    public static char[] keynotes(int n)
    {
        String s[]= {"","abc","def","ghi","jkl","mno","pqrs","tuv","wxyz"};
        String s1=s[n-1];
        char c[]=new char[s1.length()];
        for(int i=0;i<c.length;i++)
        {
            c[i]=s1.charAt(i);
        }
        return c;
    }
    public static void printKeypad(int n)
    {
        printKeypad(n,"");
    }
    public static void printKeypad(int n,String output)
    {
        if(n==0)
        {
            System.out.println(output);
            return;
        }
        char c[]=keynotes(n%10);
        for(int i=0;i<c.length;i++)
        {
            printKeypad(n/10,output+c[i]);
        }
    }
    public static void main(String[] args) {
        int n=23;
        printKeypad(n);
    }