cari

Rumah  >  Soal Jawab  >  teks badan

java - 一段递归代码的问题

在一篇博客上看到了一个递归函数,但我感觉划线的那一行似乎永远不为true呢?

因为函数里的第一个判断条件:

if (!root || p == root || q == root) return root;

就决定了left必定是p,q,null之一吧?

我对递归的理解不太深刻,不知道理解的对不对?谢谢。

阿神阿神2813 hari yang lalu673

membalas semua(2)saya akan balas

  • 迷茫

    迷茫2017-04-18 10:55:18

    Pertama sekali, anda perlu memahami bahawa terdapat 4 kemungkinan nilai pulangan fungsi rekursif ini:

    1. null, menunjukkan bahawa rekursi ini telah mengenai nod daun dan tidak boleh diteruskan.

    2. p, menunjukkan bahawa rekursi ini telah menemui nod p.

    3. q, menunjukkan bahawa rekursi ini telah menemui nod q.

    4. lowestCommonAncestor, menunjukkan nod moyang sepunya terendah yang telah ditemui.

    Mengapa anda mengatakan ini? Anda harus memahami tiga kemungkinan pertama dengan mudah, kerana daripada
    <1> jika (!root || p == root || q == root) mengembalikan akar;
    Baris kod ini boleh dilihat.

    Lihat sekali lagi (saya akan menyingkatnya)
    <2> kiri = lowestCommonAncestor(kiri, p, q);
    <3> kanan = lowestCommonAncestor(kanan, p, q);
    Dua baris ini. Sebelum lowestCommonAncestor sebenar ditemui, fungsi ini hanya boleh mengembalikan null, q, p.
    Lihat dua baris ini untuk menilai semula
    <4> jika (kiri && kiri != p && kiri != q) kembali ke kiri;
    <5> jika (kanan && kanan != p && kanan != q) kembali ke kanan;
    Apabila nilai pulangan <2> dan <3> adalah batal, p, q, syarat untuk kedua-dua penghakiman ini tidak dapat dipenuhi, jadi ia tidak akan menjadi dikembalikan.
    Jadi kita perlu memasuki penghakiman seterusnya
    <6> jika (kiri && kanan) kembali akar;
    Apakah maksud ayat ini? Jika tiada balasan daripada penghakiman <4>, <5>, ini bermakna kiri dan kanan hanya boleh menjadi salah satu daripada null, p, q,
    dan di sini juga terhad bahawa kiri dan kanan mesti menjadi bukan nol, yang bermaksud Pada masa ini, satu kiri dan kanan mestilah p dan satu lagi q.
    Pada masa ini, punca fungsi rekursif pada tahap ini (perhatikan bahawa ia adalah fungsi rekursif pada tahap ini) ialah CommonAncesstor terendah,
    jadi ia dikembalikan.
    Ayat terakhir
    <7> kembali ke kiri ? atau jika kedua-duanya
    Jika semuanya batal, kembalikan batal.

    Sekarang kembali dan lihat panggilan fungsi rekursif CommonAncesstor terendah dalam <2> dan <3> Anda boleh menganggapnya sebagai mencari p di kiri dan kanan nod

    . dan q, maka terdapat empat jenis hasil:

    1. Mengembalikan batal, menunjukkan bahawa p dan q tidak berada dalam cawangan ini sama sekali.

    2. Mengembalikan p, menunjukkan bahawa hanya terdapat p dan tiada q dalam cawangan ini.

    3. Mengembalikan q, menunjukkan bahawa hanya terdapat q di cawangan ini dan tiada p.

    4. Mengembalikan lowestCommonAncesstor, menunjukkan bahawa terdapat kedua-dua p dan q dalam cawangan ini, jadi nenek moyang mereka telah ditemui!

    Mungkin apa yang saya katakan tidak cukup teliti, saya harap ia akan membantu anda:)

    balas
    0
  • PHP中文网

    PHP中文网2017-04-18 10:55:18

    Syarat pertama adalah untuk menentukan akar, dan syarat kedua adalah untuk menentukan kiri.

    balas
    0
  • Batalbalas