2017-08-29 7 views
0

je déconner avec une question de récursion (en Java) et remarqué que le passage dans les déclarations suivantes des résultats dans 3 réponses différentes, donc ce serait bien si quelqu'un me dit quelles sont les différencesRecursion Addition différences

Voici la fonction que je tentais de recurs

if(root.left != null){ 
     getVal(root.left, level + 1); 
    } 

et Si devaient passer à

if(root.left != null){ 
     getVal(root.left, level++); 
    } 

ou

if(root.left != null){ 
     getVal(root.left, level+=1); 
    } 

ou

if(root.left != null){ 
    getVal(root.left, level=+1); 
} 

Je finirions tous obtenir des réponses différentes. Je sais que sur les 2 derniers, comment on passe l'original avant d'ajouter le 1 et on ajoute à la valeur et passe à travers, mais ne savez pas comment le premier diffère que le reste

Répondre

1
  • level + 1 ne change pas la valeur de level et passe juste la valeur de level plus 1
  • level++ passe la valeur initiale de level et incrémente la valeur de level par 1
  • level+=1 incrémente la valeur de level par 1, puis passe cette nouvelle valeur
  • level=+1 est équivalent à level= +1+ est le unary + operator, de sorte qu'il définit level égal à 1 et passe cette nouvelle valeur

UPDATE: La première et les troisièmes versions transmettent la même valeur à l'appel récursif, mais peuvent se comporter différemment selon que la variable level est utilisée par la suite.

+0

premier et troisième éléments peuvent agir différemment si la valeur 'de level' est utilisé plus loin. –

+0

@RomanPuchkovskiy Bon point, j'ai ajouté une clarification! – mosene

+0

Est-il possible de me dire comment les 1er et 3e cas pourraient être différents? Parce que dans mon cas, je reçois effectivement des résultats différents –

0
if(root.left != null){ 
    getVal(root.left, level + 1); 
} 

Ici vous passez level+1-getVal() comme argument, mais vous ne modifiez pas lui-même level.

if(root.left != null){ 
    getVal(root.left, level++); 
} 

Ici vous passez level la méthode comme argument avant il est augmenté (il est passé in extenso), mais vous modifiez également la valeur elle-même level (après l'appel de méthode).

if(root.left != null){ 
    getVal(root.left, level+=1); 
} 

Ici vous passez level+1 la méthode, et aussi vous changer level lui-même (avant l'appel).

if(root.left != null){ 
    getVal(root.left, level=+1); 
} 

Ici vous suffit de lui assigner 1-level et appelez votre méthode avec 1 comme argument.

Dans les 4 cas, vous faites réellement quelque chose de différent, d'où les résultats différents.

1

En fait, vous pouvez simplement effectuer un test simple pour voir ce qui se passe:

public static void main(String[] args){ 

    int a=3, b=3, c=3, d=3; 
    method(a+1);  //3+1, 4 was passed into the method 
    method(b++);  //post increment, 3 was passed into the method, then increase b by 1 
    method(c+=1);  //add 1 to c(3), 4 was passed into the method 
    method(d=+1);  //d set to 1, 1 was passed into the method 

    System.out.println("(Values in main) a:" + a + " b:" + b + " c:" + c + " d:" + d); 
} 

public static void method(int v){ 
    System.out.println(v); 
} 

Sortie:

4 
3 
4 
1 
(Values in main) a:3 b:4 c:4 d:1