Idea rekurencji nie jest zbyt powszechna w prawdziwym świecie. Dla początkujących programistów wydaje się to nieco mylące. Sądzę jednak, że stopniowo przyzwyczajają się do tej koncepcji. Co może być dla nich dobrym wyjaśnieniem, aby łatwo zrozumieć pomysł?
74
Odpowiedzi:
Aby wyjaśnić rekurencję , używam kombinacji różnych wyjaśnień, zwykle w celu:
Na początek Wolfram | Alpha definiuje to w prostszych terminach niż Wikipedia :
Matematyka
Jeśli twój uczeń (lub osoba, którą również wyjaśnisz, odtąd powiem studentowi) ma przynajmniej pewne podłoże matematyczne, najwyraźniej już spotkał się z rekurencją, studiując serie i ich pojęcie rekurencyjności oraz ich relację powtarzalności .
Bardzo dobrym sposobem na rozpoczęcie jest następnie zademonstrowanie za pomocą serii i powiedzenie, że po prostu chodzi o rekurencję:
Zazwyczaj dostajesz „huh huh, whatev”, co najwyżej, ponieważ nadal go nie używają, lub bardziej prawdopodobne jest to bardzo głębokie chrapanie.
Przykłady kodowania
Co do reszty, to faktycznie szczegółowa wersja tego, co przedstawiono w uzupełnieniu do mojej odpowiedzi na pytania, które wskazał w zakresie wskaźników (zły pun).
Na tym etapie moi uczniowie zwykle wiedzą, jak wydrukować coś na ekranie. Zakładając, że używamy C, wiedzą, jak wydrukować pojedynczy znak za pomocą
write
lubprintf
. Wiedzą także o pętlach sterowania.Zwykle uciekam się do kilku powtarzających się i prostych problemów programistycznych, dopóki ich nie otrzymają:
Factorial
Factorial to bardzo prosta koncepcja matematyczna do zrozumienia, a jej implementacja jest bardzo zbliżona do jej matematycznej reprezentacji. Jednak na początku mogą go nie otrzymać.
Alfabety
Wersja alfabetyczna jest interesująca, aby nauczyć ich myśleć o kolejności ich rekurencyjnych instrukcji. Podobnie jak w przypadku wskaźników, będą rzucać w ciebie losowo liniami. Chodzi o to, aby uświadomić im, że pętlę można odwrócić, modyfikując warunki LUB po prostu odwracając kolejność instrukcji w funkcji. Tutaj pomaga wydrukowanie alfabetu, ponieważ jest to dla nich coś wizualnego. Po prostu poproś, aby napisali funkcję, która wypisze jeden znak dla każdego wywołania i wywoła się rekurencyjnie, aby napisać następny (lub poprzedni).
Fani FP pomijają fakt, że drukowanie rzeczy do strumienia wyjściowego jest na razie efektem ubocznym ... Nie denerwujmy się na froncie FP. (Ale jeśli używasz języka z obsługą list, nie krępuj się łączyć z listą przy każdej iteracji i po prostu drukować końcowy wynik. Ale zwykle zaczynam je od C, co niestety nie jest najlepsze dla tego rodzaju problemów i koncepcji) .
Potęgowanie
Problem potęgowania jest nieco trudniejszy ( na tym etapie nauki). Oczywiście koncepcja jest dokładnie taka sama jak dla silni i nie ma dodatkowej złożoności ... oprócz tego, że masz wiele parametrów. I to zwykle wystarcza, aby zmylić ludzi i odrzucić ich na początku.
Jego prosta forma:
można wyrazić w następujący sposób:
Trudniej
Po pokazaniu tych prostych problemów ORAZ ponownym ich wdrożeniu w samouczkach możesz wykonać nieco trudniejsze (ale bardzo klasyczne) ćwiczenia:
Uwaga: Ponownie niektóre z nich nie są wcale trudniejsze ... Po prostu podchodzą do problemu dokładnie pod tym samym lub nieco innym kątem. Ale praktyka czyni mistrza.
Pomocnicy
Referencja
Niektóre czytanie nigdy nie boli. Na początku tak będzie, a oni poczują się jeszcze bardziej zagubieni. To coś, co rośnie na tobie i które siedzi z tyłu głowy, dopóki pewnego dnia nie zdasz sobie sprawy, że w końcu to dostałeś. A potem myślisz o tych rzeczach, które czytasz. Na razie wystarczyłyby rekursja , informatyka i strony z relacjami na Wikipedii.
Poziom / głębokość
Zakładając, że uczniowie nie mają dużego doświadczenia w programowaniu, zapewnij kody pośredniczące. Po pierwszych próbach daj im funkcję drukowania, która może wyświetlać poziom rekurencji. Pomaga wydrukowanie wartości liczbowej poziomu.
Diagram stosu jako szuflady
Wcięcie wydruku (lub wyniku poziomu) również pomaga, ponieważ daje kolejną wizualną reprezentację tego, co robi Twój program, otwierając i zamykając konteksty stosu, takie jak szuflady lub foldery w eksploratorze systemu plików.
Akronimy rekurencyjne
Jeśli twój uczeń jest już trochę zaznajomiony z kulturą komputerową, może już korzystać z niektórych projektów / oprogramowania o nazwach wykorzystujących rekurencyjne akronimy . Od pewnego czasu jest to tradycja, szczególnie w projektach GNU. Niektóre przykłady obejmują:
Rekurencyjne:
Wzajemnie rekurencyjne:
Niech spróbują wymyślić własne.
Podobnie istnieje wiele przypadków rekurencyjnego humoru, takich jak rekurencyjna korekta wyszukiwania Google . Aby uzyskać więcej informacji na temat rekurencji, przeczytaj tę odpowiedź .
Pułapki i dalsza nauka
Niektóre problemy, z którymi zwykle borykają się ludzie i na które musisz znać odpowiedzi.
Dlaczego, o Boże, dlaczego?
Dlaczego chcesz to zrobić? Dobrym, ale nieoczywistym powodem jest to, że często łatwiej jest wyrazić w ten sposób problem. Niezbyt dobrym, ale oczywistym powodem jest to, że często wymaga mniej pisania na klawiaturze (nie sprawiając, że czują się tak lojalni po prostu za pomocą rekurencji ...).
Niektóre problemy są zdecydowanie łatwiejsze do rozwiązania przy zastosowaniu podejścia rekurencyjnego. Zazwyczaj każdy problem, który można rozwiązać za pomocą paradygmatu Divide and Conquer , pasuje do wielorakiego algorytmu rekurencyjnego.
Co znowu N?
Dlaczego moja
n
lub (niezależnie od nazwy zmiennej) za każdym razem jest inna? Początkujący zazwyczaj mają problem ze zrozumieniem, czym jest zmienna i parametr oraz jak rzeczy nazwanen
w twoim programie mogą mieć różne wartości. Więc teraz, jeśli ta wartość znajduje się w pętli sterowania lub rekurencji, jest jeszcze gorzej! Bądź miły i nie używaj wszędzie tych samych nazw zmiennych i wyraź, że parametry są tylko zmiennymi .Warunki końcowe
Jak określić stan końcowy? To proste, po prostu niech mówią głośno. Na przykład dla silni zacznij od 5, następnie 4, a następnie ... aż do 0.
Diabeł tkwi w szczegółach
Nie rozmawiaj o wczesnych rzeczach, takich jak optymalizacja wezwania ogona . Wiem, wiem, TCO jest fajne, ale na początku ich to nie obchodzi. Daj im trochę czasu na owinięcie głowy procesem w sposób, który będzie dla nich odpowiedni. Zachęcamy do późniejszego rozbicia ich świata, ale dajcie im spokój.
Podobnie, nie mów prosto z pierwszego wykładu o stosie wywołań i zużyciu pamięci i ... cóż ... przepełnienie stosu . Często prowadzę prywatne zajęcia dla nauczycieli, którzy pokazują mi wykłady, na których mają 50 slajdów o wszystkim, co należy wiedzieć o rekurencji, kiedy na tym etapie ledwo potrafią poprawnie napisać pętlę. To dobry przykład tego, jak odniesienie pomoże później , ale teraz po prostu myli cię głęboko.
Ale proszę we właściwym czasie wyjaśnić, że istnieją powody, aby wybrać trasę iteracyjną lub rekurencyjną .
Wzajemna rekurencja
Widzieliśmy, że funkcje mogą być rekurencyjne, a nawet mogą mieć wiele punktów wywoławczych (8-królowych, Hanoi, Fibonacciego, a nawet algorytm eksploracji trałowca). Ale co z wzajemnie rekurencyjnymi połączeniami ? Zacznij od matematyki tutaj.
f(x) = g(x) + h(x)
gdzieg(x) = f(x) + l(x)
ah
il
po prostu zrobić rzeczy.Rozpoczynanie od samych serii matematycznych ułatwia pisanie i implementację, ponieważ wyrażenia jasno definiują kontrakt. Na przykład sekwencje żeńskie i męskie Hofstadter :
Jednak jeśli chodzi o kod, to należy zauważyć, że realizacja wzajemnie rekurencyjne rozwiązania często prowadzi do powielania kodu, a raczej powinno być usprawnione w pojedynczą postać rekurencyjną (Patrz Peter Norvig „s Rozwiązywanie Każdy Sudoku .
źródło
static unsigned int vote = 1;
ode mnie. Wybacz statyczny humor, jeśli chcesz :) To najlepsza jak dotąd odpowiedź.Wywołanie funkcji z tej samej funkcji.
źródło
Rekurencja to funkcja, która sama się nazywa.
Jak go używać, kiedy go używać i jak uniknąć złego projektu, ważne jest, aby wiedzieć, co wymaga samodzielnego wypróbowania go i zrozumienia, co się stanie.
Najważniejszą rzeczą, którą musisz wiedzieć, to być bardzo ostrożnym, aby nie uzyskać pętli, która nigdy się nie kończy. Odpowiedź pramodc84 na twoje pytanie zawiera następującą usterkę: nigdy się nie kończy ...
Funkcja rekurencyjna musi zawsze sprawdzać warunek, aby ustalić, czy powinna się ponownie wywołać, czy nie.
Najbardziej klasycznym przykładem użycia rekurencji jest praca z drzewem bez statycznych ograniczeń głębokości. Jest to zadanie, które musisz użyć rekurencji.
źródło
a
nadal wywołuje siebie, tylko pośrednio (przez wywołanieb
).Programowanie rekurencyjne to proces stopniowego zmniejszania problemu w celu łatwiejszego rozwiązywania jego wersji.
Każda funkcja rekurencyjna ma tendencję do:
Kiedy krok 2 jest przed 3, a gdy krok 4 jest trywialny (konkatenacja, suma lub nic), umożliwia to rekurencję ogona . Krok 2 często musi nastąpić po kroku 3, ponieważ wyniki z subdomeny problemu mogą być potrzebne do ukończenia bieżącego kroku.
Przejdź przez proste drzewo binarne. Przechodzenie można wykonać w przedsprzedaży, w kolejności lub po zamówieniu, w zależności od potrzeb.
Przedsprzedaż: BAC
W kolejności: ABC
Po zamówieniu: ACB
Bardzo wiele problemów rekurencyjnych to konkretne przypadki operacji na mapie lub fold - zrozumienie tylko tych dwóch operacji może prowadzić do znacznego zrozumienia dobrych przypadków użycia dla rekurencji.
źródło
OP powiedział, że rekurencja nie istnieje w prawdziwym świecie, ale błagam, by się różnić.
Weźmy prawdziwą „operację” cięcia pizzy. Wyjąłeś pizzę z piekarnika i aby ją podać, musisz pokroić ją na pół, a następnie pokroić na pół, a następnie pokroić na pół.
Operację krojenia pizzy wykonujesz wielokrotnie i dopóki nie uzyskasz pożądanego rezultatu (liczba plasterków). A dla argumentów powiedzmy, że nieoszlifowana pizza jest samym plasterkiem.
Oto przykład w Ruby:
Tak więc operacja w prawdziwym świecie to krojenie pizzy, a rekursja robi to samo w kółko, dopóki nie będziesz mieć tego, czego chcesz.
Operacje, które można zaimplementować za pomocą funkcji rekurencyjnych, to:
Polecam napisanie programu, który szukałby pliku na podstawie jego nazwy, i spróbuję napisać funkcję, która wywołuje się sama, dopóki nie zostanie znaleziona. Podpis wyglądałby następująco:
find_file_by_name(file_name_we_are_looking_for, path_to_look_in)
Możesz więc nazwać to tak:
find_file_by_name('httpd.conf', '/etc') # damn it i can never find apache's conf
Moim zdaniem jest to po prostu programowanie mechaniki, sposób na sprytne usunięcie duplikacji. Możesz przepisać to za pomocą zmiennych, ale jest to „ładniejsze” rozwiązanie. Nie ma w tym nic tajemniczego ani trudnego. Napisz kilka rekurencyjnych funkcji, kliknie i wywoła kolejną mechaniczną sztuczkę w oknie narzędzi programistycznych.
Dodatkowy kredyt Powyższy
cut_pizza
przykład da ci zbyt duży błąd poziomu stosu, jeśli poprosisz go o liczbę plasterków, która nie jest potęgą 2 (tj. 2 lub 4 lub 8 lub 16). Czy możesz go zmodyfikować, aby jeśli ktoś poprosił o 10 plasterków, nie działałby na zawsze?źródło
Dobra, postaram się zachować to proste i zwięzłe.
Funkcja rekurencyjna to funkcje, które wywołują się same. Funkcja rekurencyjna składa się z trzech rzeczy:
Najlepszym sposobem na pisanie metod rekurencyjnych jest myślenie o metodzie, którą próbujesz napisać, jako prostym przykładzie obsługującym tylko jedną pętlę procesu, który chcesz powtórzyć, a następnie dodaj wywołanie do samej metody i dodaj, kiedy chcesz zakończyć. Najlepszym sposobem na naukę jest ćwiczenie jak wszystkie rzeczy.
Ponieważ jest to strona dla programistów, powstrzymam się od pisania kodu, ale tutaj jest dobry link
jeśli masz ten dowcip, rozumiesz, co oznacza rekurencja.
źródło
Rekurencja jest narzędziem, którego programista może użyć do wywołania wywołania funkcji na sobie. Sekwencja Fibonacciego to podręcznikowy przykład użycia rekurencji.
Większość kodu rekurencyjnego, jeśli nie wszystkie, można wyrazić jako funkcję iteracyjną, ale zwykle jest on nieporządny. Dobrym przykładem innych programów rekurencyjnych są struktury danych, takie jak drzewa, drzewo wyszukiwania binarnego, a nawet szybkie sortowanie.
Rekurencja służy do tego, aby kod był mniej niechlujny, należy pamiętać, że zwykle jest wolniejszy i wymaga więcej pamięci.
źródło
Lubię używać tego:
Jak idziesz do sklepu?
Jeśli jesteś przy wejściu do sklepu, po prostu przejdź przez niego. W przeciwnym razie zrób jeden krok, a następnie przejdź resztę drogi do sklepu.
Ważne jest, aby uwzględnić trzy aspekty:
W rzeczywistości często używamy rekurencji w życiu codziennym; po prostu nie myślimy o tym w ten sposób.
źródło
for
pętli w bezsensowną funkcję rekurencyjną.Najlepszym przykładem, na który chciałbym wskazać, jest C Programming Language autorstwa K & R. strona indeksu również.
źródło
Josh K wspomniał już o lalkach Matroshka . Załóżmy, że chcesz się nauczyć czegoś, co zna tylko najkrótsza lalka. Problem polega na tym, że tak naprawdę nie można z nią rozmawiać bezpośrednio, ponieważ ona pierwotnie mieszka w wyższej lalce, która na pierwszym zdjęciu znajduje się po jej lewej stronie. Ta struktura wygląda tak (lalka mieszka w wyższej lalce), aż kończy się tylko najwyższą.
Jedyne, co możesz zrobić, to zadać pytanie najwyższej lalce. Najwyższa lalka (która nie zna odpowiedzi) będzie musiała przekazać twoje pytanie krótszej lalce (która na pierwszym zdjęciu jest po jej prawej stronie). Ponieważ ona również nie ma odpowiedzi, musi zapytać następną krótszą lalkę. Tak będzie, dopóki wiadomość nie dotrze do najkrótszej lalki. Najkrótsza lalka (która jako jedyna zna tajną odpowiedź) przekaże odpowiedź następnej wyższej lalce (znalezionej po jej lewej stronie), która przekaże ją następnej wyższej lalce ... i będzie to trwało do momentu odpowiedzi dociera do miejsca docelowego, czyli najwyższej lalki i wreszcie ... ciebie :)
To właśnie robi rekursja. Funkcja / metoda wywołuje się do momentu otrzymania oczekiwanej odpowiedzi. Dlatego podczas pisania kodu rekurencyjnego bardzo ważne jest, aby zdecydować, kiedy rekurencja powinna się zakończyć.
Nie jest to najlepsze wytłumaczenie, ale mam nadzieję, że pomaga.
źródło
Rekursja n. - Wzorzec projektowania algorytmów, w którym operacja jest definiowana sama w sobie.
Klasycznym przykładem jest znalezienie silni liczby, n !. 0! = 1, a dla każdej innej liczby naturalnej N silnia N jest iloczynem wszystkich liczb naturalnych mniejszych lub równych N. Zatem 6! = 6 * 5 * 4 * 3 * 2 * 1 = 720. Ta podstawowa definicja pozwoli ci stworzyć proste iteracyjne rozwiązanie:
Sprawdź jednak ponownie operację. 6! = 6 * 5 * 4 * 3 * 2 * 1. Według tej samej definicji 5! = 5 * 4 * 3 * 2 * 1, co oznacza, że możemy powiedzieć 6! = 6 * (5!). Z kolei 5! = 5 * (4!) I tak dalej. W ten sposób redukujemy problem do operacji wykonanej na podstawie wyników wszystkich poprzednich operacji. To ostatecznie redukuje się do punktu, zwanego przypadkiem podstawowym, w którym wynik jest znany z definicji. W naszym przypadku 0! = 1 (w większości przypadków moglibyśmy również powiedzieć, że 1! = 1). W obliczeniach często możemy definiować algorytmy w bardzo podobny sposób, wywołując samą metodę i przekazując mniejszą liczbę danych wejściowych, co zmniejsza problem przez wiele rekurencji do przypadku podstawowego:
W wielu językach można to jeszcze uprościć za pomocą operatora trójskładnikowego (czasami postrzeganego jako funkcja Iif w językach, które nie zapewniają operatora jako takiego):
Zalety:
Niedogodności:
źródło
Przykład, którego używam, to problem, z którym się spotkałem w prawdziwym życiu. Masz pojemnik (taki jak duży plecak, który zamierzasz zabrać na wycieczkę) i chcesz poznać całkowitą wagę. Masz w pojemniku dwa lub trzy luźne przedmioty i niektóre inne pojemniki (powiedzmy worki na rzeczy). Ciężar całego pojemnika to oczywiście ciężar pustego pojemnika plus ciężar wszystkiego w nim. W przypadku przedmiotów sypkich można je po prostu zważyć, a w przypadku worków z rzeczami można je po prostu zważyć lub powiedzieć „no cóż, waga każdego z worków to waga pustego pojemnika plus waga wszystkiego w nim”. A potem wchodzisz do pojemników do pojemników i tak dalej, aż dojdziesz do punktu, w którym są tylko luźne przedmioty w pojemniku. To jest rekurencja.
Może się wydawać, że tak się nie dzieje w rzeczywistości, ale wyobraź sobie, że próbujesz policzyć lub zsumować pensje osób w konkretnej firmie lub oddziale, które zawierają mieszankę ludzi, którzy po prostu pracują dla firmy, ludzi w oddziałach, a następnie w podziały są wydziały i tak dalej. Lub sprzedaż w kraju, który ma regiony, niektóre z nich mają podregiony itp. Tego rodzaju problemy zdarzają się cały czas w biznesie.
źródło
Rekurencja może być wykorzystana do rozwiązania wielu problemów z liczeniem. Załóżmy na przykład, że masz grupę n osób na imprezie (n> 1) i wszyscy podają sobie rękę dokładnie raz. Ile ma miejsce uścisków dłoni? Możesz wiedzieć, że rozwiązaniem jest C (n, 2) = n (n-1) / 2, ale możesz rozwiązać rekurencyjnie w następujący sposób:
Załóżmy, że są tylko dwie osoby. Wtedy (przez kontrolę) odpowiedź brzmi oczywiście 1.
Załóżmy, że masz trzy osoby. Wyróżnij jedną osobę i zwróć uwagę, że ona / ona ściska ręce dwóm innym osobom. Następnie musisz policzyć tylko uściski dłoni między pozostałymi dwiema osobami. Zrobiliśmy to już teraz i jest to 1. Więc odpowiedź to 2 + 1 = 3.
Załóżmy, że masz n ludzi. Zgodnie z tą samą logiką, co poprzednio, jest to (n-1) + (liczba uścisków dłoni między n-1 osobami). Rozwijając się, otrzymujemy (n-1) + (n-2) + ... + 1.
Wyrażony jako funkcja rekurencyjna,
f (2) = 1
f (n) = n-1 + f (n-1), n> 2
źródło
W życiu (w przeciwieństwie do programu komputerowego) rekurencja rzadko zdarza się pod naszą bezpośrednią kontrolą, ponieważ może być myląca. Ponadto postrzeganie zwykle dotyczy efektów ubocznych, a nie funkcjonalnej czystości, więc jeśli nastąpi rekurencja, możesz tego nie zauważyć.
Jednak na świecie zdarza się rekurencja. Dużo.
Dobrym przykładem jest (uproszczona wersja) obieg wody:
Jest to cykl, który powoduje, że jego ja ponownie się dzieje. Jest rekurencyjny.
Innym miejscem, w którym można uzyskać rekursję, jest angielski (i ogólnie ludzki język). Na początku możesz go nie rozpoznać, ale sposób, w jaki możemy wygenerować zdanie, jest rekurencyjny, ponieważ reguły pozwalają nam osadzić jedno wystąpienie symbolu obok drugiego wystąpienia tego samego symbolu.
Instynkt językowy Stevena Pinkera:
To całe zdanie, które zawiera inne całe zdania:
Akt zrozumienia pełnego zdania polega na zrozumieniu mniejszych zdań, które wykorzystują ten sam zestaw sztuczek umysłowych, aby być rozumianym jako pełne zdanie.
Aby zrozumieć rekurencję z perspektywy programowania, najłatwiej jest spojrzeć na problem, który można rozwiązać za pomocą rekurencji, i zrozumieć, dlaczego powinna być i co to oznacza, że musisz zrobić.
Na przykład użyję największej wspólnej funkcji dzielnika, w skrócie gcd.
Masz dwie liczby
a
ib
. Aby znaleźć ich gcd (przy założeniu, że nie ma wartości 0), musisz sprawdzić, czya
można go równomiernie podzielićb
. Jeśli tak, tob
jest gcd, w przeciwnym razie musisz sprawdzić gcdb
i resztęa/b
.Powinieneś już być w stanie zobaczyć, że jest to funkcja rekurencyjna, ponieważ masz funkcję gcd wywołującą funkcję gcd. Po prostu wbij go do domu, oto jest w c # (ponownie, zakładając, że 0 nigdy nie zostanie przekazane jako parametr):
W programie ważne jest, aby mieć stan zatrzymania, w przeciwnym razie funkcja będzie się powtarzać na zawsze, co ostatecznie spowoduje przepełnienie stosu!
Powodem użycia tutaj rekurencji zamiast pętli while lub innej iteracyjnej konstrukcji jest to, że podczas czytania kodu mówi on, co robi i co będzie dalej, więc łatwiej jest ustalić, czy działa poprawnie .
źródło
Oto rzeczywisty przykład rekurencji.
Pozwól im sobie wyobrazić, że mają kolekcję komiksów, a wszystko zmieszycie w jeden wielki stos. Ostrożnie - jeśli naprawdę mają kolekcję, mogą natychmiast cię zabić, gdy tylko wspomnisz o tym, aby to zrobić.
Teraz pozwól im posortować ten duży, nieposortowany stos komiksów za pomocą tego podręcznika:
Dobrą rzeczą jest to, że gdy sprowadzają się do pojedynczych problemów, mają pełną „ramkę stosu” z lokalnymi stosami widocznymi przed nimi na ziemi. Daj im wiele wydruków instrukcji i odłóż po jednym na każdy poziom stosu ze znakiem, w którym aktualnie jesteś na tym poziomie (tj. Stan zmiennych lokalnych), abyś mógł kontynuować tam na każdym Gotowym.
Właśnie o to chodzi w rekurencji: wykonywanie tego samego procesu, na bardziej szczegółowym poziomie, im więcej się w to zagłębia.
źródło
Rekursja to bardzo zwięzły sposób wyrażenia czegoś, co należy powtarzać, aż coś zostanie osiągnięte.
źródło
Nie zwykły angielski, nie tak naprawdę przykłady z prawdziwego życia, ale dwa sposoby uczenia się rekurencji poprzez grę:
źródło
Ładne wyjaśnienie rekurencji jest dosłownie „działaniem, które powraca od wewnątrz”.
Pomyśl o malarzu malującym ścianę, jest to rekurencyjne, ponieważ akcja polega na „pomalowaniu paska od sufitu do podłogi, a następnie przesunięciu go nieco w prawo i (pomalowaniu paska od sufitu do podłogi, a następnie przesunięciu go trochę w prawo i (pomaluj rozebrać się od sufitu do podłogi, a następnie przesunąć nieco w prawo i (itp.)) ”
Jego funkcja paint () wywołuje się w kółko, tworząc większą funkcję paint_wall ().
Mam nadzieję, że ten biedny malarz ma jakiś stan zatrzymania :)
źródło