Java изменить ввод в верхний регистр, используя рекурсию - PullRequest
0 голосов
/ 11 октября 2019

Привет, у меня проблема с изменением ввода в верхний регистр с помощью рекурсии. Это моя домашняя работа, и в инструкции сказано, что я не могу использовать метод toUpperCase () и / или isUpperCase ().

Я пробовал использовать цикл, и он работал.

import java.util.Arrays;

public class hw5 {

    static void convertCase(String str) {

        int[] asciiArray = new int[str.length()];
        char[] charArray = new char[asciiArray.length];
        int ascii = 0;

        for(int i = 0; i < str.length(); i++) { 
            char character = str.charAt(i); 
            ascii = (int) character;
            //change the value if lower case
            if(ascii >= 97 && ascii <= 122) {
                asciiArray[i] = ascii-32;
                charArray[i] = (char) asciiArray[i];
            }
            //don't change the value if the value is already uppercase or 0-9 (I think this is the base case)
            else if((ascii >= 65 && ascii <= 90) || (ascii >= 48 && ascii <= 57))  {
                asciiArray[i] = ascii;
                charArray[i] = (char) asciiArray[i];
            }
            System.out.print(charArray[i]);
         }
    }

    public static void main(String[] args) {

        convertCase("uPPerCAse123");
    }
}

Вывод:

UPPERCASE123

Как написать те, кто использует рекурсию?

Ответы [ 5 ]

3 голосов
/ 11 октября 2019

Один из способов, которым мы могли бы ввести рекурсию в вашу текущую логику, - это заменить итеративный цикл for рекурсивными вызовами:

public static void convertCase(String str) {
    convertCase(str, 0, str.length()-1);
}

private static void convertCase(String input, int start, int end) {
    if (input == null || start > end) {
        return;
    }
    char character = input.charAt(start); 
    int ascii = (int) character;
    if (ascii >= 97 && ascii <= 122) {
        character = (char)(ascii-32);
    }
    System.out.print(character);        
    convertCase(input, start+1, end);
}

public static void main(String args[]) throws Exception {
    convertCase("all lowercase HERE");
}

Это печатает:

ALL LOWERCASE HERE

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

2 голосов
/ 11 октября 2019
public String stringToUpperCase(String str){
    if (str.length==1) return charToUpperCase((char)str[0]);
    return charToUpperCase((char)str[0]) + stringToUpperCase(str.substring(1,str.length-1));



public Char charToUpperCase(Char char){
    int ascii = (int)char;
    if (ascii >= 97 && ascii <= 122) {
        ascii -= 32;
    }
    return (Char)ascii;
}


public static void(String... args){
    System.out.println(stringToUpperCase("asdf");
}

В этой версии stringToUpperCase () явно вызывает себя, что является ключом рекурсии.

0 голосов
/ 11 октября 2019

Вот рекурсивная реализация в Java. Он основан на рекурсии головы -

public class Main {
public static void main(String []args){
    String changed = toUpperCaseRec("sTr12uv3X");
    System.out.println(changed);
}

static String toUpperCaseRec(String str) {
    if(str == null || str.length() == 0) {
        return "";
    }

    String rem = toUpperCaseRec(str.substring(1));
    Character cc = convertToUppercase(str.charAt(0));
    return cc+rem;
}

static Character convertToUppercase(Character chr) {
    if(chr >= 97 && chr <= 122) {
        return (char)(chr - 32);
    } else {
        return chr;
    }
}

}

0 голосов
/ 11 октября 2019

Здесь моя версия в верхнем регистре для одного символа (только ASCII, не тестировалась):

char static toUpper(char ch) {
    if (ch >= 'a' && ch <= 'z') {
        ch += 'A' - 'a';
    }
    return ch;
}

или, преобразованная в условный оператор:

ch = (ch >= 'a' && ch <= 'z') ? (char) (ch + 'A' - 'a') : ch;

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

0 голосов
/ 11 октября 2019
public class Main {
  public static void main(String [] args){
    String word ="sathira";
    convertUpper(word,word.length());
  }

   static void convertUpper(String word,int length){

      if (word==null||length ==0)
        return;
   char character = word.charAt(length-1); 
    int ascii = (int) character;
    if (ascii >= 97 && ascii <= 122) {
        character = (char)(ascii-32);
    }
     convertUpper(word,length-1);
    System.out.print(character);        

  }

}

...