在《剑指offer》的面试题5:“从尾到头打印链表”,在使用递归时,为什么不能用while来代替if?
public static void printListReverse_recursively(listNode headNode){
if(headNode!=null)
{
if(headNode.next!=null)
{
printListReverse_recursively(headNode.next);
}
System.out.println(headNode.data);
}
}
Certainement pas - vous pouvez écrire vous-même une petite démo et vous saurez si vous l'essayez. Peu importe lequel
if
est remplacé parwhile
, cela mènera à une boucle infinie - car si la longueur du lien est longue. list n'est pas 0, alors il doit y avoir headNode mais pasnull
, alors si le premierif
estwhile
, alors il y aura une boucle infinie si la longueur de la liste chaînée est ; supérieur à 1, alors il doit y avoir headNode.next n'est pasnull
, alors si le deuxièmeif
estwhile
, cela provoquera une boucle infinie.if est un jugement conditionnel, while est une structure en boucle. L’un ne sera exécuté qu’une seule fois et l’autre sera exécuté plusieurs fois jusqu’à ce que la condition soit fausse.
La récursion est que la différence entre if et while est que if ne sera jugé qu'une seule fois, que le code soit exécuté ou non, if ne reviendra pas pour juger à nouveau (certaines personnes disent "ne regarderont jamais en arrière").
Si l'expression while est vraie, elle regardera en arrière et jugera plusieurs fois (reviendra en arrière et jugera à nouveau) jusqu'à ce que la condition ne soit pas remplie.
Supposons que les valeurs de la liste chaînée soient 1, 2, 3, 4 ; si vous utilisez if, 1, 2, 3, 4 sera affiché en sortie normale.
Lors de l'utilisation de while, le premier 1 n'est pas vide, ce qui fait que la première condition while (headNode.next!=null) est toujours vraie, ce qui créera une boucle infinie.
Si ce que j'ai dit est correct, j'espère qu'il sera adopté, merci !