2016-05-27 3 views
-2

Из нижеследующего вопроса я не понимаю, как идет выход. Может ли кто-нибудь объяснить мне, как это произошло?Строковый выход метода не понимает

public class mystery{ 
public static void main(String[] args) { 

    System.out.println(serios("DELIVER")); 

} 



public static String serios(String s) 
{ 
    String s1 = s.substring(0,1); 
    System.out.println(s1); 
    String s2 = s.substring(1, s.length() - 1); 
    System.out.println(s2); 
    String s3 = s.substring(s.length() - 1); 
    System.out.println(s3); 
    if (s.length() <= 3) 
      return s3 + s2 + s1; 

    else 
      return s1 + serios(s2) + s3; 
} 
} 

Выход:

D 
ELIVE 
R 
E 
LIV 
E 
L 
I 
V 
DEVILER 

Спасибо !!

+0

Посмотрите на [это] (HTTP://www.tutorialspoint.com/java/java_string_substring.htm). – Gendarme

+0

Пожалуйста, вы должны прочитать документацию и попытаться понять выход, прежде чем задавать свой вопрос. –

+0

Кроме того, существует рекурсивный вызов 'serios()'. Вы можете увидеть, что происходит, если вы используете функции отладки вашей среды IDE, задаете контрольные точки и смотрите переменные. – Arjan

ответ

0

Для этого куска кода

 String s1 = s.substring(0,1);//this initializes s1 = D as Substring reads up to right before the ending index which is 1. 
    System.out.println(s1);//print s1 

Этот блок

 String s2 = s.substring(1, s.length() - 1);//Starts where the previous chunk left off, ends right before the ending initializing s2 = ELIVE 
    System.out.println(s2);//print s2 

Final Chunk

 String s3 = s.substring(s.length() - 1);//This chunk starts from the end and captures R 
    System.out.println(s3);//print s3 

Эти три порции и их операторы печати даст вам

D ELIVE R 

Теперь давайте двигаться дальше.

Окончательный оператор возврата возвращает s1 + serios(s2) + s3. Это рекурсия, функция, называемая внутри себя.

Эта рекурсия будет работать до тех пор, пока не будет выполнено условие if. Наконец распечатать DELIVER

Вы можете увидеть рисунок, чтобы лучше понять.

DELIVER при прохождении кода распечатывается следующим образом D ELIVE R. Первая и последняя буквы отделены от центра слова.

return s1 + serios(s2) + s3; 

так s2 = ELIVE он станет равным s. Он будет разделен на части, используя подстроку так же, как DELIVER стать E LIV E установки

LIV = s2 

s теперь будет равна LIV, и быть разделены друг от друга и распечатаны, как

L I V 

Наконец длина s равна 3, поэтому условие if будет выполняться и распечатывать DEVILER

0

кроме того, что делает subString, я думаю, ваша проблема в том, что recursi поведение метода серии.

Сначала позвоните и отправьте сообщение «ДОСТАВКА».

в следующей строке вы можете видеть, является ли входной параметр более интенсивным, чем 3, вызов метода на этот раз с помощью s2. для первой итерации s2 = ELIVE.

if (s.length() <= 3) 
     return s3 + s2 + s1; 

else 
     return s1 + serios(s2) + s3; 

вы можете думать о бегущей серии («ELIVE»); и для того же процесса вы увидите, что на этот раз s2 получит «LIV», рекурсия которого больше не повторится, и если часть будет работать.

if (s.length() <= 3) 
      return s3 + s2 + s1; 

Я надеюсь, что это поможет вам.

0

Для этого типа задач, это помогает след метод вызывает

public class mystery { 
    public static void main(String[] args) 
    { 
     serios("DELIVER", ""); 
    } 

    public static String serios(String s, String indentation) 
    { 
     String s1 = s.substring(0, 1); 
     System.out.println(indentation + "\"" + s1 + "\" is the substring of \"" + s + "\" at 0"); 

     String s2 = s.substring(1, s.length() - 1); 
     System.out.println(indentation + "\"" +s2 + "\" is the substring of \"" + s + "\" from 1 to " + (s.length() - 2)); 

     String s3 = s.substring(s.length() - 1); 
     System.out.println(indentation + "\"" + s3 + "\" is the substring of \"" + s + "\" at " + (s.length() - 1)); 

     if (s.length() <= 3) 
      return s3 + s2 + s1; 
     else 
     { 
      indentation += " "; 
      return s1 + serios(s2, indentation) + s3; 
     } 
    } 
} 

Выход:

"D" is the substring of "DELIVER" at 0 
"ELIVE" is the substring of "DELIVER" from 1 to 5 
"R" is the substring of "DELIVER" at 6 
"E" is the substring of "ELIVE" at 0 
"LIV" is the substring of "ELIVE" from 1 to 3 
"E" is the substring of "ELIVE" at 4 
    "L" is the substring of "LIV" at 0 
    "I" is the substring of "LIV" from 1 to 1 
    "V" is the substring of "LIV" at 2 
Смежные вопросы