Eu tenho um bom entendimento básico dos fundamentos do C ++, também tenho um entendimento de como a recursão também funciona. Me deparei com certos problemas, como o clássico problema das oito rainhas e a solução de um Sudoku com Backtracking.
Percebo que estou bastante perdida no que diz respeito a isso, não consigo entender o conceito de voltar à pilha de recursão e começar de novo para resolver o problema. Parece fácil com caneta e papel, mas quando se trata de escrever código para isso, estou confuso sobre como começar a atacar esses problemas.
Seria útil se houvesse um tutorial voltado para iniciantes em retroceder ou se houvesse um bom livro onde isso fosse abordado. Se alguém puder esclarecer esse tópico ou me fornecer alguns links para referências decentes, ficaria muito grato.
E sim, eu sei que seria mais fácil em linguagens funcionais, mas eu gostaria de entender a implementação em linguagens imperativas também.
Respostas:
No retrocesso, você não está iniciando novamente. Em vez disso, você percorre todas as opções na situação atual.
Pense em encontrar solução para um labirinto. Em um ponto em que você tem dois caminhos diferentes, tente primeiro o esquerdo. Se o esquerdo não o levar à saída, você retornará ao ponto e tentará o outro caminho. É assim que o retrocesso funciona. Em 8 Q e outros problemas em que o backtracking pode ser usado, a parte confusa está no domínio do problema - como iterar suas opções em uma determinada situação de maneira determinística.
EDIT : o seguinte é um pseudo-código que ajuda a entender o retrocesso.
Para a pergunta 8Q:
fonte
Você viu um programa para andar em uma árvore binária, certo? Se parece com isso:
Aí está o seu retorno.
Você realmente não precisa de uma árvore física. Tudo o que você precisa é de uma maneira de fazer uma jogada e depois desfazê-la, ou dizer se você ganhou ou se não pode ir mais longe.
fonte
else{return walk(p->left)||walk(p->right));}
Não há necessidade de jogar para o esperado resultado