在《剑指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은 루프 구조입니다. 하나는 한 번만 실행되고, 다른 하나는 조건이 거짓이 될 때까지 여러 번 실행됩니다.
재귀는 if와 while의 차이점은 if는 코드 실행 여부에 관계없이 한 번만 판단되고 if는 다시 판단으로 돌아가지 않는다는 것입니다(어떤 사람들은 "절대로 뒤돌아보지 않을 것입니다"라고 말합니다).
while 표현식이 true이면 조건이 충족되지 않을 때까지 여러 번 되돌아보고 판단합니다(돌아가서 다시 판단).
연결리스트의 값이 1, 2, 3, 4라고 가정하고, if를 사용하면 1, 2, 3, 4가 정상적으로 출력됩니다.
while을 사용하면 첫 번째 1이 비어 있지 않으므로 첫 번째 while(headNode.next!=null) 조건이 항상 true가 되어 무한 루프가 생성됩니다.
제가 말한 내용이 맞다면 채택되길 바라겠습니다. 감사합니다!