Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将字符移动到字符串末尾的递归_Java_String_Recursion - Fatal编程技术网

Java 将字符移动到字符串末尾的递归

Java 将字符移动到字符串末尾的递归,java,string,recursion,Java,String,Recursion,我需要得到一个字符串,并通过递归重新排列它,得到char,通过这个char,我必须将字符串上的所有字符移动到末尾 比如“你好,世界!”,“我”=>“你好,我的世界” 我很难理解递归的思维方式 所以我从这个开始: public static String ChToLast (String str, char ch){ if(str.indexOf(ch)== -1){ return str; }else{ if(str.indexOf(0) == c

我需要得到一个字符串,并通过递归重新排列它,得到char,通过这个char,我必须将字符串上的所有字符移动到末尾 比如“你好,世界!”,“我”=>“你好,我的世界” 我很难理解递归的思维方式 所以我从这个开始:

public static String ChToLast (String str, char ch){
    if(str.indexOf(ch)== -1){
        return str;
    }else{
        if(str.indexOf(0) == ch){
            return str;
        }
    }

感谢您的帮助:)

递归是在其内部重用方法的实践。在这种情况下,我将提供一个解决方案来解释发生了什么:

public static String chrToLast(String str, char ch) {
    //This if statement details the end condition
    if(str.length() < 1) {
        return "";
    }

    String newString = str.substring(1); //Create new string without first character

    if(str.indexOf(ch) == 0) { //This happens when your character is found
        return chrToLast(newString, ch) + ch;
    } else { //This happens with all other characters
        return str.charAt(0) + chrToLast(newString, ch);
    }
}
这将产生所需的结果:
Heo,Word!lll

过程

通常,此方法的工作方式是检查给定字符串中当前的第一个字符,然后决定执行什么操作。如果第一个字符与您要查找的字符相同(
l
),它将从字符串中删除该字符,并在新字符串上使用
chrToLast
。但是,它还使用
+ch
将找到的字符添加到结果的末尾。它将继续执行此操作,直到不再剩下字符,这就是结束条件的作用

结束条件

结束条件返回一个空字符串
,因为这就是算法的基本情况。您可以将递归算法看作是通过多次调用自身来解决问题的算法。通过调用它们自己,递归算法向一个基移动。在这种特殊情况下,每次执行该方法时,它都会从字符串中减去一个字符。一旦没有剩余的字符,它将到达基本大小写,即
”,其中字符串最终为空,不能再减去任何字符。(因此,作为最终状态,它不返回任何内容)

我希望这能回答你的问题。理解这个概念很重要,因为它非常强大。如果有不清楚的地方,试着研究代码并注释


在IDE中执行此代码并使用调试器遍历其执行过程也会有所帮助。然后,您可以自己查看程序的流程,并查看正在运行的变量的值。

如果使用递归,调用预期的结果将非常昂贵。字符串或字符元素的大量移动,就像你做的那样。我不认为这是一个更明智的选择。我会这样做,空间复杂度O(2n)和性能复杂度O(n)

如果您使用while loop并编写一个方法来检查该字符串是否表示完美语句,那么这可能适合您 在这里,你需要一些NLP概念的帮助来检查每次排列的字符是否有任何语句或语法正确。
这会有帮助

你能解释一下你要做什么吗?递归基本上有两个主要部分。第一,是你的结束条件。何时需要停止递归。2是continue条件,该方法何时需要调用自身?@NocNit从字符串中选择一个字符,并将所有出现的字符移动到字符串的末尾。该函数假定使用递归@NocNit将单个字符串和一个字符移动到字符串的末尾。谢谢您的时间如果我的答案解决了您的问题,请将其标记为已接受。也帮了我不少忙;)为什么它在结束条件时返回空字符串?它这样做是因为不再有可返回的字符了。它执行函数多次,每次删除字符串的第一个字符时:
helloworld->
ello World->等等。一旦字符串为空,它就需要停止。因此,它没有继续,而是立即返回一个空字符串。更新了我的答案以添加有关最终条件的信息。我是新手,我将对NLP概念进行一些研究谢谢
chrToLast("Hello, World!", 'l')
public class Solve {
public static void main(String[] args) {
    System.out.println(ChToLast("Hello world!", 'l'));
}

public static String ChToLast(String str, char ch) {
    char[] chars = str.toCharArray();
    char[] modChars = new char[chars.length];
    int i = 0;      
    for(char element : chars){
        if(ch != element){
            modChars[i++] = element;
        }
    }
    Arrays.fill(modChars, i, chars.length , ch);
    return new String(modChars);
}   
}