Сторнирование строки - PullRequest
       3

Сторнирование строки

2 голосов
/ 02 февраля 2012

Я просто изучал, как я могу перевернуть строку. Я нашел программу в C # Полный справочник, но я не смог ее понять. Плз кто нибудь объясните как это работает

Программа здесь:

using System;
class RevStr 
{
    // Display a string backward.
    public void DisplayRev(string str) 
    {
        if(str.Length > 0)
            DisplayRev(str.Substring(1, str.Length-1));
        else
            return;

        Console.Write(str[0]);
    }
}

class RevStrDemo 
{
    static void Main() 
    {
        string s = "this is a test";
        RevStr rsOb = new RevStr();
        Console.WriteLine("Original string: " + s);
        Console.Write("Reversed string: ");
        rsOb.DisplayRev(s);
        Console.WriteLine();
    }
}
  1. Как работает эта программа?
  2. Вызывает ли оператор rsOb.DisplayRev(s); DisplayRev(str.Substring(1, str.Length-1)); для каждого символа в строке?

Ответы [ 9 ]

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

Что бы я порекомендовал

Вы пробовали myString.Reverse();

Это был бы самый простой способ перевернуть строку в C # (.Net 3.5 и выше).

Ответ

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

Вам нужно будет вызвать DisplayRev(s); только один раз, потому что он рекурсивно отображает каждый символ внутри.

Объяснение Попытка

Например, у нас есть строка "hello".

Первый вызов будет рекурсивно вызывать функцию с substring из "hello", которая будет "ello"

Обратите внимание, что вызов Console.WriteLine не был выполнен, потому что была вызвана функция DisplayRev, поэтому мы переходим к рекурсивному вызову.

Это будет происходить до тех пор, пока строка не станет пустой (.Length == 0). Затем функция выйдет и вернется к вызывающей стороне, где строка [0] будет иметь значение «o», будет введен код Console.WriteLine, записывающий «o» в консоль, затем эта функция будет завершена, и вызывающий абонент затем нажмет Console.WriteLine, который будет "l", он будет возвращаться до тех пор, пока не будет достигнут первоначальный вызов.

Таким образом, ваша исходная строка перевернута.

Ссылка

Вокруг рекурсии существует множество уроков. Вот несколько (они будут лучше объяснять это, чем я):

Пример рекурсии 1
Пример рекурсии 2

3 голосов
/ 02 февраля 2012

Нет.

Он использует Рекурсивные вызовы

DisplayRev вызывает себя на один символ меньше

, когда он добирается доконец и назад из рекурсии - он печатает символ.

Также обратите внимание, что он просто отображает почитаемую строку, а не фактически почитает ее

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

Это рекурсивный вызов одной и той же функции.

В основном она основана на том факте, что команда Console.Write не вызывается до тех пор, пока не будет возвращен предыдущий вызов DisplayRev.

Каждому вызову DisplayRev передается строка, в которой удален первый символ: Для

str = "abcdef"
str.Substring(1, str.Length-1)

дает "bcdef"

Команда консоли записывает первый символ (str [0]).

К тому времени, когда обрабатывается последний вызов DisplayRev, str [0] равен "f".

Все вызовы затем возвращаются к первому вызову с большим количеством отображений, например:

Console.Write("f")
Console.Write("e")
Console.Write("d")
Console.Write("c")
Console.Write("b")
Console.Write("a")
1 голос
/ 02 февраля 2012

Что там происходит внутри в class.look внимательно
Смотрите, есть функция Подстрока вызывает с двумя параметрами.

  1. - длина строки [ здесь только символ ]
  2. позиция в строке
    а затем распечатать этот символ. и это рекурсивный вызов, так что это происходит до тех пор, пока длина строки не станет нулевой.
0 голосов
/ 30 мая 2018

Множество людей, похоже, хотят сделать это ... один из простых способов - использовать Array.Reverse

Передать строку в массив char, использовать Array.Reverse, а затем передать массив char в виде строки.

Public static string ReverseString(string str)
{
char[] arr = str.ToCharArray();
Array.Reverse(arr);
return new string(arr);}
0 голосов
/ 06 июля 2015

Сторнирование строки (наиболее эффективный алгоритм): следующее не относится к суррогатным парам UTF-16.

public static String reverse(String orig){
   char[] s = orig.ToCharArray();
   int n = s.Length;
   int halfLength = n / 2;
   for (int i = 0; i < halfLength; i++){
     char temp = s[i];
     s[i] = s[n - 1 - i];
     s[n - 1 - i] = temp;
    }
    return new String(s);
}
0 голосов
/ 02 февраля 2012

Выполнить пробный прогон:

input string = "Это тест";

Вызывается рекурсивная обратная функция:

public void DisplayRev(string str)      
{         
    if(str.Length > 0)             
        DisplayRev(str.Substring(1, str.Length-1));
    else
         return; 

    Console.Write(str[0]);     
}

Вызов стека с аргументом:

DisplayRev("t")             // ----> prints "t"

DisplayRev("st")            // ----> prints "s" ----> complete string "ts"

DisplayRev("est")           // ----> prints "e" ----> complete string "tse"

DisplayRev("test")          // ----> prints "t" ----> complete string "tset"

DisplayRev(" test")         // ----> prints " " ----> complete string "tset "

DisplayRev("a test")        // ----> prints "a" ----> complete string "tset a"

DisplayRev(" a test")       // ----> prints " " ----> complete string "tset a "

DisplayRev("s a test")      // ----> prints "s" ----> complete string "tset a s"

DisplayRev("is a test")     // ----> prints "i" ----> complete string "tset a si"

DisplayRev(" is a test")    // ----> prints " " ----> complete string "tset a si "

DisplayRev("s is a test")   // ----> prints "s" ----> complete string "tset a si s"

DisplayRev("is is a test")  // ----> prints "i" ----> complete string "tset a si si"

DisplayRev("his is a test") // ----> prints "h" ----> complete string "tset a si sih"

DisplayRev("This is a test")// ----> prints "t" ----> complete string "tset a si siht"
0 голосов
/ 02 февраля 2012

Эта программа просто выводит строку в обратном порядке, она никак не изменяет строку. Вот как это работает - это основано на рекурсии. Если вы напечатаете обратную часть подстроки исходной строки, начиная с позиции 1 (то есть str.Substring (1, str.Length-1)), а затем напечатаете первый символ строки, вы в итоге перевернете всю строку , Очевидно, что эта функция верна для строк длиной 1, и после этого вы можете доказать с помощью индукции и вышеприведенного наблюдения, что данная функция будет печатать строку, полностью измененную для всех длин.

Однако, есть встроенная функция для обращения строки, если вы не настаиваете на ее самостоятельной реализации:

str.Reverse();
0 голосов
/ 02 февраля 2012

Почему бы вам не использовать встроенную функциональность строки?

string s =  "123";
s = s.Reverse();
...