Proč byste se měli učit rekurzi, i když ji nikdy nebudete používat? Rekurzivní řešení vás naučí několika způsobům myšlení: 1. Spíše než se snažit vygenerovat řešení často začínáte s prací "jaká je struktura platného řešení" zpětně. U některých problémů je práce pozpátku mnohem snazší. 2. Když řešíte problém, je snadné se nechat rozptýlit všemi těmi "co kdyby". Při rekurzivním řešení problému jste často nuceni "ignorovat" 90 % problémů a soustředit se na to, abyste správně zvládli pouze jednu část. 3. To, co by často bylo "rohovým" případem v imperativním řešení, je "základním případem" v rekurzivním řešení. Rekurzivní myšlení vás někdy nutí neignorovat okrajové případy. Rekurzivní řešení navíc hojně využívají porovnávání vzorů, takže jste nuceni přemýšlet o všech situacích, které vás mohou potkat. Zde je opravdu dobrý příklad: Leetcode 335 Self Crossing (Těžký problém). Pohybujete se po spirálovité trajektorii po mřížce (tj. po ujetí určité vzdálenosti na sever, jih, východ nebo západ vždy odbočíte doleva). Otázka zní: "Vezmeme-li v úvahu vzdálenost každého 'segmentu' spirály v daném pořadí, protnula se spirála sama nebo ne?" I když řešením nemusí být funkce, která volá sama sebe, "pěkné" řešení používá rekurzivní vlastnosti: 1. Pokud jsme ještě nenašli křížení, pak můžeme předpokládat, že v minulosti žádné křížení neexistovaly ani neplatné přechody. Dále si všimneme, že nezáleží na tom, zda cestujeme doleva, doprava, nahoru nebo dolů, protože můžeme pouze odbočit doleva. Jediné, co nás zajímá, je, zda jsou předchozí segmenty rovnoběžné s naším předchozím tahem a jak daleko jsou. 2. Když odbočíme doleva, ve spirále je extrémně omezený počet "segmentů", do kterých můžeme narazit, což je "rekurzivně" pravda bez ohledu na to, jak velká spirála je. Existuje mnoho minulých dat o spirále, která můžeme ignorovat. 3. Ve vašem předchozím tahu je omezený počet scénářů, které ovlivňují vaši logiku: a) cestovali jste dostatečně daleko, abyste do ničeho nenarazili, b) pokud ne, do čeho byste mohli potenciálně narazit? (také omezeno). Nepříjemná věc na těžkých počítačích Leetcode je, že se najednou stanou snadnými, pokud najdete klíčový vhled. Ale tyto klíčové vhledy k vám přijdou přirozeněji, pokud jste se trénovali v rekurzivním programování. Nejde jen o navrhování funkcí, které si říkají samy – jde o to přinutit se rozebrat problém takovým způsobem, aby mohl být vyřešen tím, že funkce volá sama sebe. Čím více způsobů můžete problém rozebrat, tím je pravděpodobnější, že najdete "aha" řešení. Je zřejmé, že ve své profesi nepotřebuji leetcode, ale potřebuji najít kreativní způsoby, jak rozebrat problémy tak, aby se staly srozumitelnými – a trénink v rekurzi mi s tím rozhodně pomohl.
1,67K