Funkcje rekurencyjne w Pythonie

W tym samouczku zobaczymy Rekurencja z przykładami w Pythonie. Rekurencja w programowaniu to bardzo potężna technika, odbywa się za pomocą funkcji, które same się wywołują, traktuj to jako rodzaj pętli, ponieważ ten sam kod będzie powtarzany kilka razy, aż do osiągnięcia rozwiązania.

Cechy, które musi mieć funkcja rekurencyjnaPrzypadek podstawowyPozwoli nam to zakończyć funkcję w pewnym momencie i że nieskończone wywołania nie wystąpią.
Sprawa rekurencyjnaW tym przypadku ponownie wywołamy funkcję, ale zbliżymy się do rozwiązania. Na przykładach będzie to wyglądało lepiej.

NotatkaWażne jest, aby jasno określić przypadek podstawowy i wiedzieć, że przypadek rekurencyjny zbliża się do niego i nie wchodzi w stan nieskończonych wywołań, jest to częsty błąd podczas rozpoczynania od rekurencji.

Przejdźmy do przykładów, które będą proste i krótkie, aby można je było dobrze przyswoić.

Przykład 1 - Factorial


W tym przykładzie będziemy rozwiązać silnię liczbyJeśli chcesz wiedzieć, o co chodzi w silni, odwiedź ten link. Oto kod, a poniżej wyjaśniam funkcję rekurencyjną.
 def silnia (liczba): if (liczba == 0 lub liczba == 1): zwróć 1 else: zwróć numer * silnia (liczba-1) if __name__ == "__main__": try: num = int (input ("Od Jaką liczbę chcesz poznać silnia? ")) if (num <0): print (" Liczba musi być większa lub równa 0") else: print (" Silnia ", num" jest ", silnia (num ) z wyjątkiem: print ("Oczekiwana jest liczba") 
Nasza funkcja rekurencyjna ma bazowy przypadek w if i rekurencyjny w else. Widać, że przypadek podstawowy zwraca 1 i że jest to osiągane, gdy parametr przekazany do funkcji wynosi 0 lub 1, po osiągnięciu tego przypadku funkcja nie wywołuje ponownie. W przypadku rekurencyjnym mamy wywołanie funkcji do siebie, ale jak widać zmniejszenie parametru o 1 (zbliżamy się do przypadku bazowego). Ostatnia część kodu poza funkcją odpowiada jedynie za zapytanie użytkownika o liczbę i sprawdzenie, czy jest ona większa lub równa 0, aby wywołać funkcję, ponieważ silnia z liczbami ujemnymi nie działa.

Jeśli wywołamy funkcję o numerze 4, czyli silnię (4), to mamy następujące wywołania:

 Zadzwoń 1: silnia (4) Zadzwoń 2: 4 * silnia (3) Zadzwoń 3: 3 * silnia (2) Zadzwoń 4: 2 * silnia (1)
Podczas wywoływania silni z 1 nie ma już wywołań i zwróci 1, wtedy ta funkcja zwraca wyniki do funkcji, którą ją wywołuję, zwrot byłby taki:
 silnia (1) = 1 silnia (2) = 2 * 1 silnia (3) = 3 * 2 silnia (4) = 4 * 6
I już mamy nasz wynik, który wynosi 24, z pomnożenia liczb: 1 * 2 * 3 * 4. Następnie zostawiam zrzut ekranu, gdy pytam o silnię 5, która jest niczym innym jak pomnożeniem 5 przez silnię 4 (którą już wiemy, że to 24), dając w rezultacie 120. Możesz to również zobaczyć, jeśli użytkownik wstawi liczbę źle, to jest:

Przykład 2 - Dodawanie odejmowanie


W tym przykładzie umieściłem funkcję rekurencyjną do dodawania lub odejmowania, oczywiście ten przykład zwykle nie występuje w prawdziwym życiu, ale jako przykład działa:
 def operacja (liczba1, liczba2): if (liczba2 == 0): zwróć liczba1 elif (liczba2 <0): operacja powrotu (liczba1-1, liczba2+1) else: operacja powrotu (liczba1 + 1, liczba2-1) if __name__ == "__main__": print ("Dodaje 10 i 3:", operuj (10, 3)) print ("Dodaj 5 i -2:", operuj (5, -2)) 
Tutaj mamy przypadek bazowy i 2 przypadki rekurencyjne, aby wiedzieć, w jaki sposób dotknąć, ponieważ w zależności od tego, czy liczba jest dodatnia, czy ujemna, będziemy musieli postępować inaczej. Funkcja operacji otrzymuje 2 liczby, a algorytm zajmie się odjęciem lub dodaniem jedynki do liczby2 i przekazaniem jej do liczby1 (jeśli liczba2 jest dodatnia, odejmuję 1 od liczby2 i dodaję ją do liczby1), tak aby zmienna liczba2 była równa do 0.

Na przykład dodamy 3 + 2 widząc połączenia.

 Zamówienie 1: działanie (3,2) Zamówienie 2: działanie (4,1) Zamówienie 3: działanie (5,0)
W tym przypadku, gdy dochodzimy do działania (5,0) nie pozostaje nic innego do zrobienia, wynik mamy bezpośrednio (w przeciwieństwie do silni, która musiała wykonać mnożenie). Oto wynik wykonania kodu:

NotatkaChoć z rekurencją mamy rozwiązanie eleganckie i zwykle krótsze powinno być używane, gdy nie mamy innej możliwości, to jeśli możemy ciągnąć jej wariant iteracyjny, będzie to lepszy wybór, ponieważ zużywa mniej pamięci i zwykle jest szybszy.

Podobał Ci się i pomógł ten samouczek?Możesz nagrodzić autora, naciskając ten przycisk, aby dać mu pozytywny punkt

Będziesz pomóc w rozwoju serwisu, dzieląc stronę ze swoimi znajomymi

wave wave wave wave wave