Varför ska du lära dig rekursion även om du aldrig kommer att använda det? Rekursiva lösningar tränar dig på några tankesätt: 1. Istället för att försöka generera lösningen börjar man ofta med "hur är strukturen för en giltig lösning" arbeta sig bakåt. För vissa problem är det mycket lättare att arbeta baklänges. 2. När du löser problemet är det lätt att bli distraherad av alla "tänk om". När man löser ett problem rekursivt tvingas man ofta att "ignorera" 90 % av problemen och fokusera på att bara få en del rätt. 3. Det som ofta skulle vara ett "hörn"-fall i en imperativ lösning är ett "basfall" i ett rekursivt on. Att tänka rekursivt tvingar dig ibland att inte ignorera hörnfallen. Dessutom använder rekursiva lösningar mycket mönstermatchning så att du tvingas tänka på alla situationer du kan stöta på. Här är ett riktigt bra exempel: Leetcode 335 Self Crossing (Svårt problem). Du färdas på en spiralbana på ett rutnät (dvs. svänger alltid vänster efter att ha rest en bit norrut, söderut, österut eller västerut). Frågan är, "med tanke på avståndet för varje 'segment' av spiralen i ordning, korsade spiralen sig själv eller inte?" Även om lösningen på detta inte behöver vara en funktion som anropar sig själv, använder den "trevliga" lösningen rekursiva egenskaper: 1. Om vi inte har hittat en korsning ännu, kan vi anta att det inte finns några korsningar eller ogiltiga spiraler i det förflutna. Vi märker dessutom att det inte spelar någon roll om vi reser vänster, höger, uppåt eller nedåt eftersom vi bara kan svänga vänster. Det enda vi bryr oss om är om de tidigare segmenten är parallella med vår förra sväng och hur långt bort de är. 2. När vi svänger vänster finns det ett extremt begränsat antal "segment" i spiralen vi kan krascha in i, vilket är "rekursivt" sant oavsett hur stor spiralen blir. Det finns en hel del tidigare data om spiralen som vi kan ignorera. 3. Det finns ett begränsat antal scenarier i din tidigare tur som påverkar din logik: a) reste du tillräckligt långt för att inte krascha in i något, b) om inte, vad skulle du potentiellt kunna krascha in i? (även begränsad). Det irriterande med Leetcode hards är att de plötsligt blir lätta om du hittar den viktigaste insikten. Men dessa viktiga insikter kommer till dig mer naturligt om du har tränat dig själv i rekursiv programmering. Det handlar inte bara om att designa funktioner som anropar sig själva – det handlar om att tvinga sig själv att bryta ner problemet på ett sådant sätt att det kan lösas med en funktion som kallar sig själv. Ju fler sätt du kan bryta ner ett problem på, desto mer sannolikt är det att du hittar en aha-lösning. Självklart behöver jag inte leetcode i mitt yrke, men jag behöver hitta kreativa sätt att bryta ner problem så att de blir begripliga – och utbildning i rekursion har definitivt hjälpt till med det.
1,67K