在《剑指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);
}
}
Sudah tentu tidak - anda boleh menulis demo kecil sendiri dan anda akan tahu jika anda mencubanya Tidak kira yang mana
if
digantikan denganwhile
, ia akan membawa kepada gelung tak terhingga - kerana jika panjang dipautkan. senarai bukan 0, maka mesti ada headNode tetapi bukannull
, maka jikaif
pertama ialahwhile
, maka akan ada gelung tak terhingga jika panjang senarai terpaut itu lebih besar daripada 1, maka mesti ada headNode.next bukannull
, maka jikaif
kedua ialahwhile
, ia akan menyebabkan gelung tak terhingga.jika ialah penghakiman bersyarat, manakala struktur gelung. Satu hanya akan dilaksanakan sekali, dan satu lagi akan dilaksanakan beberapa kali sehingga syarat itu palsu.
Rekursi ialah perbezaan antara if dan while ialah if hanya akan dinilai sekali, tidak kira sama ada kod itu akan dilaksanakan, jika tidak akan kembali untuk menilai lagi (sesetengah orang berkata "tidak akan melihat ke belakang").
Jika ungkapan while itu benar, ia akan melihat ke belakang dan menilai beberapa kali (kembali dan menilai semula) sehingga syarat tidak dipenuhi.
Jika nilai dalam senarai terpaut adalah 1, 2, 3, 4 menggunakan jika, 1, 2, 3, 4 akan menjadi output sebagai output biasa.
Apabila menggunakan while, 1 pertama tidak kosong, yang menyebabkan keadaan while pertama (headNode.next!=null) sentiasa benar, yang akan mencipta gelung tak terhingga.
Sekiranya apa yang saya katakan itu betul, saya harap ia akan diterima pakai, terima kasih!