2016-01-26 3 views
-3

Почему:Рекурсия Если заявление помощь

public static void splat(String s) 
{ 
    if (s.length() < 8) 
    { 
     splat(s+s); 
    } 
    System.out.println(s); 
} 

не распечатайте ********

, когда знак ("**") называется

+4

Вы отлаживали его, чтобы посмотреть, что происходит? –

+0

будет, но он также будет печатать '****' и' ** 'впоследствии. Возьмите совет @JonSkeet и отлаживайте его –

+1

Это, по-видимому, печатает много вещей ... –

ответ

2

каждый раз, когда знак будет называемые System.out.println (s); выполнена таким образом, выход будет

******** 
**** 
** 

распечатать только ******** сделать так:

public static void splat(String s) 
{ 
    if (s.length() < 8) 
    { 
     splat(s+s); 
    } 
    else 
    { 
     System.out.println(s); 

    } 
} 
+1

Это ужасно. Скопируйте свой код правильно. –

+1

Почему он начинается с печати ******** вместо того, чтобы начинаться с ** – Rolando

+2

@Rolando, потому что println после вызова метода, он будет продолжать удваивать ', пока он не станет меньше 8. Затем будет выполнен первый println. – Spencer4134

0

Я предполагаю, что ваш результат:

******** 
****** 
**** 
... 

Поскольку вы печатаете внутри функции.

При перемещении Println из функции, которую вы должны получить желаемый результат с возвращением

public static void main(String[] args){ 
    System.out.println(splat("**")); 
} 

public static String splat(String s){ 
    if (s.length() < 8){ 
     s = splat(s+s); 
    } 
    return s; 
} 
0

Вы должны включили выход. Я запускаю это и поставит его здесь:

******** 
**** 
** 

Причина заключается в том, что при вызове метода, как это, первый раз, если заявление выходит ложь, он будет печатать «****** **' как и ожидалось. Но он будет забрать, где он остановился на последнем звонке, что означает, что он будет запускать этот println снова с s '****'. Наконец, он выполнит первоначальный вызов, где s - «**».

Вместо того, чтобы напомнить метод, вы должны использовать цикл, чтобы фактически изменить значение с с s = s + "**";

Например, использовать это вместо того, если заявление:

while (s < 8) 
s += "**"; 

Это будет работать до тех пор, 's' is '********'

Надеюсь, это поможет!

Смежные вопросы