Рекурсивное удаление символов в Java - PullRequest
2 голосов
/ 06 февраля 2012

В качестве упражнения приведенный ниже блок кода предназначен для рекурсивного прохождения строки и удаления всех символов «x». Это делает это, но я хотел бы отслеживать newStr, не передавая его в качестве параметра в методе. Есть ли способ перенести его в тело метода?

Спасибо!

public static String deathToX(String str, String newStr) {  
    //look for x char
    if(str.substring(0, 1).equals("x")) {
        //do nothing
    } else {
        //add non-x char to newStr
        newStr += str.charAt(0);
    }

    if(str.length() == 1) {
        return newStr;
    }

    return deathToX(str.substring(1), newStr);
}

public static void main(String[] args) {
    System.out.println("Return: " + deathToX("xnoxmore", ""));
}

Ответы [ 4 ]

6 голосов
/ 06 февраля 2012

Ну, вы можете изменить код на:

public static String deathToX(String str)
{   
    // Termination case
    if (str.length() == 0)
    {
        return str;
    }
    // Work out whether or not we want the first character
    String prefix = str.startsWith("x") ? "" : str.substring(0, 1);

    // Let the recursive call handle the rest of the string, and return
    // the prefix (empty string or the first character) followed by the
    // x-stripped remainder.
    return prefix + deathToX(str.substring(1));
}

Это то, о чем вы думали?

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

1 голос
/ 06 февраля 2012

Я бы хотел отслеживать newStr, не передавая его в качестве параметра в методе.

Почему?Передача промежуточного результата в функцию часто требуется в рекурсивном программировании в функциональном стиле.Я делаю функцию, которая обрабатывает большую часть работы и принимает аккумулятор, и создаю функцию-обертку, которая вызывает предыдущую с требуемым начальным значением:

private static String deathToX0(String str, String newStr) {
    // the original implementation
}

public static String deathToX(String str) {
    return deathToX(str, "");
}

В качестве отступленияне хочу использовать String для промежуточного результата из-за копирования.A StringBuilder будет быстрее.

0 голосов
/ 27 июня 2019
public class solution {

    // Return the changed string
    public static String removeX(String input){
    if(input.equals("") || input.equals("x"))
            return "";

        String returnStr="";
        removeX(input.substring(1));
        for(int i=0;i<input.length();i++)
        {
            if(input.charAt(i)=='x')
                continue;
            else
                returnStr+=input.charAt(i);
        }
        return returnStr;
    }
}

Это мой подход.Этот код идет до конца строки, если он получает X как последнюю строку, он возвращает «» (ничего), затем он проверяет всю подстроку на «x», если он присутствует в строке, он будет продолжен, иначе ондобавит символ покоя к этой строке, и это продолжается.Наконец возвращает обновленную строку.Надеюсь это поможет..!!ну, это мой первый вклад здесь:)

0 голосов
/ 06 февраля 2012

Короткий ответ - да ... с рекурсией, обычно на пути вниз по дереву, вы обрабатываете бит на каждом уровне, в данном случае это пустой или текущий символ. Поэтому оператор return должен вызывать себя рекурсивно, а затем в нижней части дерева нужный ответ восстанавливается путем сложения разделов на каждом уровне.

public static String deathToX(String str){
    if (!str.isEmpty()){
        return (str.substring(0, 1).equals("x") ? "" : str.substring(0, 1)) + deathToX(str.substring(1));
    }else{
        return "";
    }
}

public static void main(String[] args){
    System.out.println("Return: " + deathToX("xnoxmore"));
}

В приведенном выше примере я использовал сокращение if format, чтобы поместить все это в одну строку, но вы можете расширить его. Вы должны увидеть, что рекурсивная функция рекурсивно используется в операторе return, и я поместил специальный случай для последнего уровня. Если вам нужно разделить это и поместить эти уровни, ответьте в локальной переменной, например. Тогда вы должны использовать tmp:

return tmp + deathToX(str.substring(1));

Помните, что рекурсия означает, что текущее выполнение приостанавливается только до тех пор, пока не завершатся нижние, поэтому вы можете с радостью хранить информацию для восстановления на пути к резервному копированию. Надеюсь, это поможет:)

...