Tak nie raz juz musialem uzyc rekurencji.
Teraz mojego konkretnego przykladu nie pamietam, ale dam na szybko przyklad z wordpressa.
System shortcodów.
Mozesz zarejestrowac shortcode [galeria] - jak ktos go wpisze wpisze w tresci posta, to pojawi sie zamiast niego galeria, to samo co bbcode.
Dalej - mozesz zarejestrowac
Kod:
[galeria]
[video id="5"]
[image id="33"]
[post id="251"]
[/galeria]
Kazdy z tych kodow to inny shortcode, ale jesli chcesz aby w galerii, w srodku wpisane shortcody byly tez zamieniane na odpowiednie elementy, to trzeba znowu wywolac funkcje konwertujaca [video] na odpowiedni kod html.
To jest wlasnie rekurencja. Wewnatrz konwersji stringa, natykasz na string ktory rowniez musi byc skonwertowany, ktory rowniez zawiera string ktory musi byc skonwertowany.
Raz nawet popelnilem gwalt na kompilacji PHP.
Zrobiłem plik tree-leaf.php ktory w kodzie mial
include('tree-leaf.php');
Zapewne bylo to zajebiscie nieefektywne, bo include nie jest kompilowane - za kazdym razem parsowany jest plik od nowa. Gdyby plik byl duzy bo bylaby niezla klapa, ale w tym przypadku byl maly, i zagniezdzony maksymalnie 5x, wiec zostawilem jak jest, bo i tak roznica nie zauwazalna.
Czy latwiej/czytelniej? Wszystko zalezy od problemu. Kazda funkcje rekurencyjna da sie zapisac jako iteracyjna, i odwrotnie. Roznica jest jednak ogromna, na studiach nam wykladowca pokazywal funkcje rekurencyjna ktora zajmowala 15 linijek, a jej odpowiednik iteracyjny wymagal okolo 350linii kodu, zeby zrobic to samo.
A czytelniej - na pewno rekurencyjna jest bardziej czytelna :D
Sortowanie quicksort/heapsort nie ma sensu bez rekurencji. Cale jego sedno opiera sie na podzieleniu problemu na mniejszy, i zrobienia tego samego.
Zakładki