Java 使用递归将输入更改为大写

Java change input to uppercase using recursion

您好,我在使用递归将输入更改为大写时遇到了问题。这是我的作业,说明上说我不允许使用 toUpperCase() and/or 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

如何写那些使用递归的?

我们可以将递归引入您当前逻辑的一种方法是用递归调用替换迭代 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 输入指针打印字符串的一个字母。然后,它进行递归调用,将起始指针递增 1,以递归地向下处理输入字符串。

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()显式调用自身,这是递归的关键

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);        

  }

}

这里我的版本是一个字符大写(只有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;

这些可以很容易地插入到其他答案中已经提出的任何其他递归解决方案中(不确定我更喜欢哪个,奇怪在递归中完成方式)

这是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;
    }
}

}