2015-05-09 5 views
2

Вот рекурсивный Funtion -Использование оператора декремента Java в рекурсивной функции

private void printVar01(int t){ 
    if(t != 0){ 
     logp.info("o: "+t); 
     printVar01(t-1); 
    } 
} 

же Funtion с небольшим изменением -

private void printVar02(int t){ 
    if(t != 0){ 
     logp.info("o: "+t); 
     printVar02(t--); 
    } 
} 

Если я прохожу в значении interger как 4, printVar01 работ как и ожидалось, где t уменьшается до 0 в последовательных recrsive вызовах, в результате чего программа выходит.

С printVar02, т остается на значение 4.

Почему? Я предполагаю, что это имеет какое-то отношение к присваиванию переменной и/или как значения передаются функциям.

+1

https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op1.html –

+0

yup Я должен был прочитать этот документ дважды :). также это - http: // stackoverflow.com/questions/484462/difference-between-i-and-i-in-a-loop –

ответ

2

просто использовать --t вместо T--

private static void printVar02(int t){ 
if(t != 0){ 
    logp.info("o: "+t); 
    printVar02(--t); 
} 
+0

Да, это правильно, если имя метода - 'printVar', а не' printVar02'. –

+1

что он имел в виду, я понял это, когда сказал: «Вот рекурсивная функция» Я уверен, что он просто тестировал, почему он использовал 01 и 02 – DoubleMa

3

t-1 не меняется t пока t-- не делает.

  • t-1 дает новое значение, не влияя на фактическое значение t
  • t-- дает t и чем уменьшает значение t

Я думаю printVar02 должен работать нормально и в printVar01 значение остается тем же ,


Для комментария DoubleMa

фактически 01 воли работает не 02, в 01 т меняется, но в 02 функции вызывает себя перед изменением значения Т, он просто необходимо использовать -t;

Я также определенно подозреваю рекурсивный звонок.

Если вы имеете в виду printVar = printVar01 = printVar02.

Если вы звоните printVar рекурсивно, чем t-1 будет работать как рекурсивный вызов будет заставить его работать и в t-- будет проходить одинаковое значение 4 каждый раз, как это использование postdecrement predecrement --t вместо этого.

+2

Фактически 01 будет работать не 02, в 01 t меняется, но в 02 функция вызывает себя перед изменением значения T, ему просто нужно использовать -t; – DoubleMa

2

Сообщение декремента значения декреты на 1 после выполнения заявления printVar(t--). Следовательно, каждый раз 4 передается функции.
Использование должно использовать -t вместо этого, который сначала выполняет декремент.