在《剑指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);
}
}
絶対にそうではありません。自分で小さなデモを作成して試してみると、どれを使用しても
if
换成while
,都会导致无限循环 —— 因为如果链表长度不为 0 的话,则肯定存在 headNode 不为null
,那么如果第一个if
为while
,那么就会无限循环;如果链表长度大于 1 的话,则肯定存在 headNode.next 不为null
,那么如果第二个if
为while
無限ループに陥ることがわかります。ifは条件判定、whileはループ構造です。 1 つは 1 回のみ実行され、もう 1 つは条件が false になるまで複数回実行されます。
再帰とは、if と while の違いは、コードが実行されるかどうかに関係なく、if は 1 回だけ判断され、if は再度判断するために戻って判断されることはないということです (「決して振り返らない」という人もいます)。
while 式が true の場合、条件が満たされなくなるまで何度も遡って判定します (戻って再度判定します)。
リンクされたリストの値が 1、2、3、4 の場合、if を使用すると、1、2、3、4 が通常の出力として出力されます。
while では、最初の 1 が空ではないため、最初の while (headNode.next!=null) 条件が常に true になり、無限ループが作成されます。
私の言ったことが正しければ、採用していただけると幸いです、ありがとうございます!