2009-11-22 3 views
0

Как написать java-программу, используя рекурсивный метод, который принимает int как «234» и преобразует его в соответствующие буквы на телефонной клавиатуре (2 = ABC, 3 = DEF и т. Д.), , и распечатывает перестановки этого? например:Письма с номерами Java recursion

вход = 234

выход = АДГ АДГ ADI AEG AEH АЕИ АФГ AFH AFI БДГ ВДН ШДБ BEG BEH BEI БФГ BFH BFI КОДИРОВАНИЯ CDH КДИ КЭГ ЦВЗ CEI CFG CFH КФУ


вход = 89

выход = TW TX TY TZ UW UX UY UZ VW VX VY VZ

+1

Это домашнее задание? – Bozho

+0

Зачем вам нужна рекурсия? – jheddings

+0

Он этого не делает. Однако учитель делает это. –

ответ

0

Вот версия без массива или массива. Результаты печатаются на stdout по вашему запросу.

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); 
    } 
} 
+3

-1 Я не думаю, что предоставление полной рабочей программы является подходящим ответом на вопрос о домашнем задании. –

1
  1. Возьмите вход, конвертировать нанизывать

  2. Вызов функции генерации (String префикс, суффикс строки) с пустым префиксом и превращали вход в качестве суффикса

  3. Внутри генерировать(), удалите первую цифру от суффикса, сопоставьте его в массив соответствующих букв и рекурсивно вызывать generate() для каждой буквы из массива, добавляя его к префиксу.

1
import 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; 
    } 
} 

ява 234 номер телефоны

ADG 
ADH 
ADI 
AEG 
AEH 
AEI 
AFG 
AFH 
AFI 
... 
+0

отличный код, спасибо! увы, мне не разрешено использовать ArrayLists. Сделал бы это намного проще. – quantum

+0

Почему вам не разрешено использовать ArrayList? –

4

генерация перестановки в одиночку будут представлять собой хорошее домашнее задание, не говоря уже о вынужденной рекурсии и номер телефона отвлечение.

Небольшое количество перестановок может быть эффективно сгенерировано способом, аналогичным sorting networks. Последовательность n элементов имеет n! перестановки (при условии, что полный ничья, с каждой перестановкой, состоящей из n элементов). Заметим, что для последовательности из двух элементов, существуют две перестановки:

  • первоначальную последовательность, и
  • два элемента меняются местами.

Для получения последовательности из трех элементов, существует шесть перестановок:

  • перестановка два нижних элементов, то
  • вращать последовательность одно право клеток (или слева) и
  • перестановки нижних двух элементов, затем
  • поверните последовательность на одну ячейку слева (или справа, напротив выше) и
  • перестановки бо ttom два элемента.

То есть, это двухэлементная версия, выполняемая три раза, с двумя промежуточными преобразованиями.Теперь последовательность из четыре элемента имеет двадцать четыре перестановки:

  • перестановки три нижних элементов, то
  • сохранить положение 1, присваивают от 0 до 1, от 3 до 0, и сохраненного значения для 3 и
  • перестановки трех нижних элементов, то
  • позиции своп 0 и 2, своп позиции 1 и 3 (или повернуть вправо на 2) и
  • перестановки трех нижних элементов, то
  • сохранить позицию 3, назначить от 2 до 3, 0 до 2, а сохраненное значение - 0 и
  • перестановки нижних трех элементов.

Вы видите, как выглядит шаблон? Обратите внимание на рекурсивный характер решения?

Выше четырех элементов, узоры сложнее обнаружить. Вы можете выполнить итерацию последовательности, заменяя выбранный элемент последним элементом, изменяя последовательность, каждый раз расширяя нижние 24 перестановки.

Попробуйте записать его на бумаге, записав шаги, которые вы предпринимаете, чтобы перетасовать элементы, и вы обнаружите, что написали нужную вам программу.


Примечание также, что большинство решений, размещенных здесь используют тип String и держать измельчения его и повторной сборке его. String - это плохой выбор, учитывая, что он неизменен, когда генерация перестановок лучше всего делать путем замены и поворота элементов в векторе (на самом деле, ring).

Это редкий случай, когда вы действительно должны писать буквы в поток назначения, поэтому смещайте свое решение против этой операции. Используйте массив символов и записывайте символы в поток один за другим, когда пришло время испускать определенную перестановку. Формирование строки только для сброса записи в поток включает ненужное выделение и копирование.

+0

благодарим вас за объяснение! – quantum