Šajā apmācībā mēs redzēsim Rekursija ar piemēriem Python. Programmēšanas rekursija ir ļoti spēcīgs paņēmiens, to veic ar funkcijām, kas sevi sauc, uzskata to par sava veida cilpu, jo viens un tas pats kods tiks atkārtots vairākas reizes, līdz tiek sasniegts risinājums.
Rekursīvās funkcijas raksturlielumiBāzes korpussTas ļaus mums kādā brīdī pārtraukt funkciju un nenotiks bezgalīgi zvani.
Rekursīvs gadījumsŠajā gadījumā mēs vēlreiz izsaucam funkciju, bet mēs tuvosimies risinājumam. Piemēros tas izskatīsies labāk.
PiezīmeIr svarīgi būt skaidrībā par pamata gadījumu un zināt, ka rekursīvais gadījums tuvojas tai un nenonāk bezgalīgu zvanu stāvoklī, tā ir izplatīta kļūda, sākot ar rekursiju.
Pievērsīsimies piemēriem, kas būs vienkārši un īsi, lai tos varētu labi asimilēt.
1. piemērs - Faktoriāli
Šajā piemērā mēs to darīsim atrisināt skaitļa faktoriāluJa vēlaties uzzināt, kas ir faktoriāls, apmeklējiet šo saiti. Šeit ir kods, un zemāk es izskaidroju rekursīvo funkciju.
def faktoriāls (skaitlis): ja (skaitlis == 0 vai skaitlis == 1): atgriežas 1 cits: atgriežas skaitlis * faktoriāls (skaitlis-1), ja __vārds__ == "__main__": mēģiniet: num = int (ievade ("No Kādu skaitli vēlaties uzzināt par faktoriālu? ")) If (numur <0): print (" Skaitlim jābūt lielākam vai vienādam ar 0 ") else: print (" Faktoriālis ", num," ir ", faktoriāls (numurs)), izņemot: drukāt (" Gaidāms skaitlis ")Mūsu rekursīvajai funkcijai ir pamata gadījums if un rekursīvajai citai. Jūs varat redzēt, ka pamata gadījums atgriež 1 un ka tas tiek sasniegts, kad funkcijai nodotais parametrs ir 0 vai 1, sasniedzot šo gadījumu, funkcija vairs neizsauc. Rekursīvā gadījumā mums ir funkcijas izsaukums, bet kā jūs varat redzēt parametra samazināšanu par 1 (mēs tuvojamies pamata gadījumam). Pēdējā koda daļa, kas atrodas ārpus funkcijas, ir atbildīga tikai par to, lai lietotājam prasītu numuru un pārbaudītu, vai tas ir lielāks vai vienāds ar 0, lai izsauktu funkciju, jo faktoriāls ar negatīviem skaitļiem nedarbojas.
Ja izsaucam funkciju ar numuru 4, tas ir, koeficientu (4), mums ir šādi izsaukumi:
Zvans 1: faktoriāls (4) Zvans 2: 4 * faktoriāls (3) Zvans 3: 3 * faktoriāls (2) Zvans 4: 2 * faktoriāls (1)Zvanot faktoriālam ar 1, zvanu vairs nav, un tas atgriezīs 1, tad šī funkcija atgriezīs rezultātu atdošanu funkcijai, ko es to saucu, atgriešanās būtu šāda:
faktoriāls (1) = 1 faktoriāls (2) = 2 * 1 faktoriāls (3) = 3 * 2 faktoriāls (4) = 4 * 6Un mums jau ir rezultāts, kas ir 24, reizinot skaitļus: 1 * 2 * 3 * 4. Tālāk es atstāju ekrānuzņēmumu, kad prasu koeficientu 5, kas ir nekas vairāk kā reizinot 5 ar koeficientu 4 (kas mums jau ir zināms, ir 24), kā rezultātā iegūstot 120. Varat arī redzēt, ka, ja lietotājs ievieto numuru nepareizi, tas ir:
2. piemērs - saskaitīšana / atņemšana
Šajā piemērā es ievietoju rekursīvu funkciju, lai pievienotu vai atņemtu, protams, šis piemērs parasti nenotiek reālajā dzīvē, bet kā piemērs tas darbojas:
def darboties (skaitlis1, skaitlis2): ja (skaitlis2 == 0): atgriezt skaitli1 elifs (skaitlis2 <0): atgriezties darboties (skaitlis1-1, skaitlis2 + 1) cits: atgriezties darboties (skaitlis1 + 1, skaitlis2-1), ja __name__ == "__main__": print ("Pievienojot 10 un 3:", darbiniet (10, 3)) print ("Pievienojot 5 un -2:", darbiniet (5, -2))Šeit mums ir pamata gadījums un 2 rekursīvi gadījumi, lai zinātu, kā pieskarties, jo atkarībā no tā, vai skaitlis ir pozitīvs vai negatīvs, mums būs jārīkojas citādi. Darbības funkcija saņem 2 ciparus, un algoritms parūpēsies, lai skaitlis2 tiktu atņemts vai pievienots un nodots skaitlim1 (ja skaitlis2 ir pozitīvs, es no skaitļa2 atņemu 1 un pievienoju to skaitlim1), tātad, līdz mainīgais skaitlis2 ir vienāds uz 0.
Piemēram, mēs pievienosim 3 + 2, redzot zvanus.
Zvans 1: darboties (3,2) Zvanīt 2: darbināt (4,1) Zvans 3: darbināt (5,0)Šajā gadījumā, kad mēs sākam darboties (5,0), nekas cits nav jādara, rezultāts tiek iegūts tieši (atšķirībā no faktoriāla, kuram bija jāveic reizināšana). Šeit ir koda izpildes rezultāts:
PiezīmeLai gan ar rekursiju mums ir elegants risinājums un parasti tas ir īsāks, tas jāizmanto, ja mums nav citas iespējas, ja mēs varam izmantot iteratīvo variantu, tā būs labāka izvēle, jo tā patērē mazāk atmiņas un parasti ir ātrāka.
Vai jums patika šī apmācība un palīdzējāt tai?Jūs varat apbalvot autoru, nospiežot šo pogu, lai sniegtu viņam pozitīvu punktu