recursão é o processo de definir um problema (ou a solução para um problema) em termos de (uma versão mais simples de) si mesmo. por exemplo, podemos definir a operação “encontre o seu caminho para casa” como:
-
Se estiver em casa, pare de se mexer. dê um passo em direcção a casa.
-
“find your way home”.
aqui a solução para encontrar o caminho para casa são dois passos (três passos). Primeiro, não vamos para casa se já estamos em casa., Em segundo lugar, fazemos uma acção muito simples que torna a nossa situação mais simples de resolver. Finalmente, refizemos todo o algoritmo.
o exemplo acima é chamado recursão de cauda. É aqui que a última afirmação está chamando o algoritmo recursivo. A recursão de cauda pode ser traduzida diretamente em loops.
Como você escreveria um “algoritmo” recursivo para encontrar o quadrado do Templo?
outro exemplo de recursão seria encontrar o valor máximo em uma lista de números. O valor máximo em uma lista é o primeiro número ou o maior dos números restantes., Aqui é como devemos escrever o pseudocódigo do algoritmo:
Partes de um Algoritmo Recursivo
Todos os algoritmos recursivos têm de ter o seguinte:
-
Caso Base (por exemplo, quando parar)
-
Trabalhar na direção da Base de dados de Caso
-
Chamada Recursiva (i.é., chamada de nós mesmos)
O “trabalhar na direção de caso de base” é onde fazemos o problema mais simples (por exemplo, dividir a lista em duas partes, cada uma menor que o original). A chamada recursiva, é onde usamos o mesmo algoritmo para resolver uma versão mais simples do problema., O caso base é a solução para o problema” mais simples ” possível (por exemplo, o caso base no problema ‘encontrar o maior número em uma lista’ seria se a lista tivesse apenas um número… e por definição, se há apenas um número, é o maior).
exemplo simples: adicionar três números
adicionar três números é equivalente a adicionar os dois primeiros números, e, em seguida, adicionar estes dois números novamente.
(Note, in Matlab, a function can be called without all the arguments. A função nargin diz ao computador quantos valores foram especificados., Assim add_numbers(1) teria um nargin de 1; add_numbers(1,1) teria um nargin de 2; add_numbers(1,1,1) teria um nargin de 3.)
identifique as 3 partes do algoritmo recursivo:
todo algoritmo recursivo deve ter as seguintes três etapas:
por que a recursão funciona
em um algoritmo recursivo, o computador “lembra” cada estado anterior do problema. Esta informação é “mantida” pelo computador na “pilha de ativação” (ou seja, dentro de cada espaço de trabalho de funções).
cada função tem o seu próprio espaço de trabalho por chamada da função.,
Maze exemplo:
considere uma grade retangular de salas, onde cada sala pode ou não ter portas nos lados norte, sul, leste e Oeste. como consegue sair de um labirinto? Aqui está um possível “algoritmo” para encontrar a resposta:
para cada porta na sala atual, se a porta leva à saída, pegue essa porta.
O “truque” aqui é claro, como sabemos se a porta leva a uma sala que leva à saída? A resposta é que não temos, mas podemos deixar que o computador descubra por nós.
Qual é a parte recursiva sobre o algoritmo acima?, É a “porta leva para fora do labirinto”. Como sabemos se uma porta sai do labirinto? Sabemos porque dentro da sala ao lado (passando pela porta), fazemos a mesma pergunta, como saímos do labirinto?
O Que Acontece é que o computador “lembra” todo o “What ifs”. E se eu pegar a primeira porta, e se eu pegar a segunda porta, e se eu pegar a porta ao lado, etc. E para cada porta possível você pode mover-se através, o computador lembra aqueles que se, e para cada porta depois disso, e depois disso, etc, até que o fim é encontrado.
Aqui está uma perto da implementação de código real.,Pergunta: Qual é o caso de base acima?
resposta: (Essa foi uma pergunta com rasteira) não há caso base no código. Você precisa verificar no início se o quarto é a saída. Se for, nada de repetições! pergunta: Como você marca a sala como visitada? resposta: Existem várias técnicas. Se a sala é uma estrutura (ou objeto), você pode adicionar a direção do campo visitado para a sala. (por exemplo, sala.visited = true;)se você não estiver usando objetos, Você pode ter uma matriz de bandeiras booleanas que é o mesmo tamanho/forma que o labirinto e usar esses valores.,
pergunta:são os outros problemas com o algoritmo acima? Resposta
: a resposta para isso pode ser encontrada pensando sobre a seguinte pergunta: O que aconteceria se o labirinto fosse uma grade gigante de salas retangulares de tamanho idêntico, cada uma com portas em cada parede? Imagina que vais para norte pela primeira porta, depois para este pela porta dos quartos ao lado, depois para sul pela porta dos quartos, e depois para oeste pela porta dos quartos. Onde vais parar? De volta ao ponto de partida! Pior, podes continuar a fazer este loop para sempre. Como é que um aventureiro intrépido resolveria este problema?,
uma resposta para isso é usando um pedaço de giz e colocando um grande X no chão de cada sala que você entra. Assim, quando você volta para uma sala com um X no chão, você sabe que não precisa entrar. No caso do programa, deve ser utilizada uma bandeira booleana” vista” ou “visitada”. Todos os quartos têm uma bandeira. Todos os quartos começam com a bandeira sendo configurada como falsa. Quando se visita uma sala, coloca-se a bandeira como verdadeira., Finalmente, o “caso base” você tem uma linha como:
function success = find_way_out( maze, room ) % exit chack if room is visited → return false % rest of code ... end
Recursividade pode ser igualmente aplicada a algoritmos de computador:
Alguns de Computador relacionados com os exemplos incluem: a Adição de uma lista de números, calcular a seqüência de Fibonacci, calcular um Factorial, e Sudoku.
Loops e recursão de cauda
alguns algoritmos recursivos são muito semelhantes a loops. Estes algoritmos são chamados de “tail recursive” porque a última afirmação no algoritmo é “reiniciar” o algoritmo. Algoritmos recursivos de cauda podem ser traduzidos diretamente em loops.
Deixe uma resposta