Por que deverias aprender recursão mesmo que nunca a uses? Soluções recursivas treinam-te em algumas mentalidades: 1. Em vez de tentares gerar a solução, muitas vezes começas com “qual é a estrutura de uma solução válida” e trabalhas para trás. Para alguns problemas, trabalhar para trás é muito mais fácil. 2. Quando estás a resolver o problema, é fácil distrair-te com todos os “e se”. Ao resolver um problema recursivamente, muitas vezes és forçado a “ignorar” 90% das questões e focar-te em acertar apenas uma parte. 3. O que muitas vezes seria um caso “marginal” numa solução imperativa é um “caso base” numa recursiva. Pensar recursivamente às vezes força-te a não ignorar os casos marginais. Além disso, soluções recursivas fazem uso intensivo de correspondência de padrões, por isso és forçado a pensar em todas as situações que poderias encontrar. Aqui está um exemplo muito bom: Leetcode 335 Self Crossing (Problema difícil). Viajas numa trajetória espiral num grid (ou seja, sempre viras à esquerda após viajar uma certa distância para norte, sul, leste ou oeste). A questão é: “dada a distância de cada ‘segmento’ da espiral em ordem, a espiral cruzou-se a si mesma ou não?” Embora a solução para isto não precise ser uma função a chamar-se a si mesma, a solução “bonita” utiliza propriedades recursivas: 1. se ainda não encontramos um cruzamento, então podemos assumir que não há cruzamentos ou espirais inválidas no passado. Notamos ainda que não importa se estamos a viajar para a esquerda, direita, para cima ou para baixo, porque só podemos virar à esquerda. Tudo o que nos importa é se os segmentos anteriores são paralelos à nossa viragem anterior e quão longe estão. 2. quando viramos à esquerda, há um número extremamente limitado de “segmentos” na espiral com os quais podemos colidir, o que é “recursivamente” verdade não importa quão grande a espiral se torne. Há muitos dados passados sobre a espiral que podemos ignorar. 3. Há um número limitado de cenários na tua viragem anterior que afetam a tua lógica: a) viajaste longe o suficiente para não colidir com nada, b) se não, com o que poderias potencialmente colidir? (também limitado). A parte irritante dos problemas difíceis do Leetcode é que de repente se tornam fáceis se encontrares a chave de insight. Mas esses insights-chave virão a ti de forma mais natural se te tiveres treinado em programação recursiva. Não se trata apenas de desenhar funções que se chamam a si mesmas — trata-se de forçar-te a dividir o problema de tal forma que possa ser resolvido com uma função a chamar-se a si mesma. Quanto mais formas conseguires dividir um problema, mais provável é que encontres uma solução “aha”. Obviamente, não preciso de fazer Leetcode na minha profissão, mas preciso de encontrar formas criativas de dividir problemas para que se tornem compreensíveis — e o treino em recursão ajudou-me definitivamente com isso.
1,65K