2012-05-20 2 views
2
class RecTest 
{ 
    int values[]; 

    RecTest(int i) 
    { 
     values=new int[i]; 
    } 

    void pray(int i) 
    { 
     if (i==0) return; 
     else 
     {  
      System.out.println(+values[i-1]); 
      pray(i-1); 
     } 
    } 
} 

class aka 
{ 
    public static void main(String h[]) 
    { 
     RecTest ob=new RecTest(10); 
     int i; 
     for(i=0;i<10;i++) 
      ob.values[i]=i; 
     ob.pray(10); 
    } 
} 

Эта программа работает нормально, она печатает 9,8,7,6,5,4,3,2,1,0 в порядке убывания. Но когда я меняю System.out.println (+ значения [i-1]) и заявления молитвы (i-1), он печатает от 0 до 9 в порядке возрастания.Описание использования рекурсии

Может кто-нибудь объяснить мне, почему это происходит?

Я просто не могу понять. Источник-Java-2, полная ссылка, 5th Edition, стр. 171

+3

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

+0

Спасибо. Я буду помнить это о будущем. Я новичок, я только начал, поэтому, пожалуйста, не возражайте. –

+3

* «так что пожалуйста, не возражайте» * Это актуально для проблемы, ** вы ** должны учитывать это (как в «исправить»). Как бы то ни было, я только что закончил его редактирование. –

ответ

7

Он меняется, печатаете ли вы по стопке или возвращаетесь обратно. Либо напечатайте текущий номер, затем глубже или глубже, затем распечатайте текущий номер.

3 > 
    2 > 
     1 > 
     print 1 
    print 2 
print 3 

или

3 
print 3 > 
     2 
     print 2 > 
        1 
        print 1 
+3

+1 - «... печатаете ли вы по стопке или возвращаетесь». Отличное, мощное, но очень краткое и краткое описание. – jmort253

2

Когда вы берете этот раздел

System.out.println(+values[i-1]); 
pray(i-1); 

и переключать их, думать о прогрессировании кода.

Выполнение шага в молитве, но прежде чем оно может что-либо напечатать, оно снова отправляется в молитву (на этот раз с i = 8), и прежде чем оно сможет напечатать это, оно снова отправляется в молитву (с i = 7).

Наконец, глубоко в этой цепочке, молись, наконец, выходит. Когда i = 0, молитва возвращается, а цепочка замедленного запуска начинает разматываться.

Отпечаток, самый низкий в цепочке, вызывается (когда i = 0), а затем этот метод молитвы завершается, и следующая распечатка в цепочке называется (i = 1) ... и т. Д.

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

1

Написанный таким образом, ваш код говорит «распечатайте i-1, затем сделайте все остальное». Таким образом, он печатает 9, затем продолжается с другими числами. В этом контексте «делать все остальное» означает печать 8, 7 и т. Д. Но, что важно, 9 печатается первым.

Но если вы отмените эти две строки кода, в нем говорится «сделайте все остальное, а затем распечатайте i-1». Таким образом, он имеет дело с другими числами, затем печатает 9. В этом контексте «имеет дело» означает print ..., 7, 8. Но, что важно, 9 печатается последним.