Java && || dans les déclarations RETURN?

Je regarde quelques exemples d’algorithmes Java et je tombe sur ce code d’extrait au sein d’une méthode récursive:

boolean subTree(TreeNode t1, TreeNode t2) { if (t1 == null) { return false; } if (t1.value == t2.value) { if (treeMatch(t1, t2)) return true;; } return (subTree(t1.left, t2) || subTree(t1.right, t2)); } 

Ne sachant pas (et ne voyant jamais) || être utilisé dans une déclaration return avant, sans parler d’une déclaration récursive, m’a vraiment rendu confus. J’ai copié le code dans Eclipse pour voir s’il était valide et si. J’ai ensuite remplacé le || with && et Eclipse ne semblaient pas déranger. Logiquement, je comprends que ce code récursif est supposé continuer dans les sous-arbres gauche et droit de TreeNode t1, mais je cherche une explication plus théorique derrière le fonctionnement de cette syntaxe Java.

Quelqu’un peut-il expliquer la signification derrière || et && dans la déclaration de retour de Java? Qu’est-ce que cela signifie en termes de récursivité? Est-ce seulement significatif lorsqu’il est utilisé en conjonction avec la récursivité?

Comme défini dans la signature de la méthode, vous devrez renvoyer un boolean . Par conséquent, après le mot-clé de return , vous devrez fournir un boolean ou une expression évaluée en boolean .

Dans votre cas, vous avez l’expession (subTree(t1.left, t2) || subTree(t1.right, t2)); dans lequel les deux opérandes seront évalués à boolean et vous ne leur appliquerez un OR logique que si le premier est évalué à false . Si le premier opérande true le second ne sera pas évalué et true sera répété.

Ils fonctionnent de la même manière, qu’il y ait ou non une déclaration récursive. Dans ton expression:

 (subTree(t1.left, t2) || subTree(t1.right, t2)) 

si le premier appel à subTree(t1.left, t2) évalué à true , la seconde expression ne sera ni appelée ni tentée d’être évaluée. Ceci est juste le comportement standard de court-circuit du || et && et comment les opérateurs travaillent avec les arguments qui leur sont donnés.

Ceci est la logique ou l’opérateur qui vous renverra la valeur booléenne

  return (subTree(t1.left, t2) || subTree(t1.right, t2))// return boolean value 

et && vous a également écrit la valeur booléenne comme

 return (subTree(t1.left, t2) && subTree(t1.right, t2))// return boolean value 

Les deux opérateurs fonctionnent de la même manière que Mathematical Logic

Le return de Java ne return qu’une seule valeur définie par le corps de la méthode. Si vous le considérez comme une fonction générique (ce n’est pas le cas mais cela aide à comprendre), cela devient comme un return(boolean result) dans votre exemple. Maintenant, comme avec toute autre méthode, vous pouvez effectuer des calculs en ligne qui donnent une valeur intermédiaire, qui est ensuite transmise (appelée anonymement ) à la fonction réelle comme Math.round(a + 0.5) .

Combinez cela et

 final boolean result = subTree(t1.left, t2) || subTree(t1.right, t2); return result; 

devient

 return (subTree(t1.left, t2) || subTree(t1.right, t2)); 

Il n’y a que des booléens et / ou des courts-circuits.

Court-circuit signifie qu’il évalue le premier opérande, puis le second seulement si nécessaire pour décider du résultat. Vous savez, vrai || x = vrai; false && x = false quelle que soit la valeur de x, elle n’est même pas évaluée dans ces cas.

Si l’évaluation a des effets secondaires et que vous voulez qu’ils se produisent toujours, vous devez utiliser & ou | qui n’utilise pas de court-circuit, les deux opérandes sont évalués.

 return (subTree(t1.left, t2) || subTree(t1.right, t2)); 

Evalue la première clause subTree(t1.left, t2) puis la seconde.

Ainsi, le nœud jusqu’au nœud feuille évaluera, puis commencera à sauvegarder l’arborescence en travaillant avec le nœud de droite (et tous ses nœuds restants en premier).

Je vais l’expliquer en fonction de la [spécification du langage Java] :

Une déclaration de retour est définie comme suit:

 ReturnStatement: return Expression opt ; 

Une instruction return avec une expression tente de transférer le contrôle à l’appelant de la méthode qui le contient; la valeur de l’ expression devient la valeur de l’appel de la méthode

… l’ exécution d’une telle instruction return évalue d’abord l’expression .

Qu’est-ce qu’une expression:

Une expression est une construction composée de variables , d’ opérateurs et d’invocations de méthodes, construits selon la syntaxe du langage, qui donne une valeur unique.

 return (subTree(t1.left, t2) || subTree(t1.right, t2)); 

Dé-construisons-le:

 return Expression; //Statement Expression : (subTree(t1.left, t2) || subTree(t1.right, t2)) 

Comme déjà dit – une expression est composée d’ invocations de méthodes , d’opérateurs, etc. – subTree

(Résultat de la sous-arborescence d’invocation de méthode) Opérateur logique (Résultat de la sous-arborescence d’invocation de méthode)

Le résultat serait la valeur de l’évaluation de l’expression.