2016-08-22 4 views
2

Я читаю книгу под названием «Think Java: как думать, как компьютерный ученый», и недавно я использовал рекурсивные методы.Как изменилась рекурсивная функция, называемая изменением результата?

public static void countdown(int n) 
    if (n == 0) { 
     System.out.println("Blastoff!"); 
    } else { 
     System.out.println(n); 
     countdown(n - 1); 
    } 
} 

Это будет нормальный рекурсивный метод, используемый для отсчета времени до 0, и я понимаю, что происходит, но если вы делаете рекурсивный вызов до System.out.println как этот

if (n == 0) { 
    System.out.println("Blastoff!"); 
} else { 
    countup(n - 1); 
    System.out.println(n); 
} 

он подсчитывает способ oppisote, поэтому, если бы я дал аргумент 3 для обоих этих утверждений о состоянии, то 1-й отправляется «3, 2, 1, Blastoff!». но второй 1 идет «Blastoff, 1, 2, 3» .... Я не понимаю, как это работает, может кто-то попытается объяснить, что происходит в этом коде, что заставляет его рассчитывать обратным образом?

+0

Привет и добро пожаловать в сеть обмена стеками. Сайт, на котором вы размещаете (безопасность), касается защиты данных и сетей от злоумышленников, - так что ваш вопрос довольно не по теме. Я проголосовал, чтобы переместить его в Stack Overflow, где он получит лучший ответ. –

+0

Я проголосовал также. user122144, почему вы поставили вопрос здесь? – unforgettableid

ответ

0

Когда вы звоните countup(n - 1) перед печатью, печать недоступна до остановки рекурсии. Во время рекурсии номера помещаются в стек. После того, как рекурсия завершена, все числа выходят из стека.

Мы знаем, что стек равен LIFO (Last In First Out). Так как он вставляет в стек в порядке 3,2,1. Вот почему, когда цифры выходят из стека, они находятся в порядке 1, 2, 3.

Но в первом подходе печать выполняется до рекурсивного вызова. Вот почему вы получаете в порядке 3,2,1.

1
if (n == 0) { 
    System.out.println("Blastoff!"); 
} else { 
    countup(n - 1); 
    System.out.println(n); 
} 

Вот только потому, что вы размещаете countdown(n-1) перед system.out.println(n);

При размещении до System.out.println(n), этот метод будет продолжать звонить из countdown(n-1) до его окончания вызова и курсор переходит к следующему System.out. Println.

Итак, вот как рекурсия работает, его, как самостоятельный метод содержал, один способ вызова другого метода ...... наконец последний унцию метода получает законченный, его возвращается к последней 1 и то последний 2 и последний-н

в вашем случае, сначала идет в countdown(n-1), и держать caling тот же метод, пока он reachs, n==0. Как только n==0, тогда все вызовы метода возвращаются к их System.out.println(n);

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