1.3 - Recursividade


Um procedimento ou função que contenha, dentro de sua estrutura, uma chamada para si mesmo é denominada recursiva.

"Se há uma única habilidade que distingue um programador novato de um experiente é a compreensão da recursão. Um subprograma é recursivo se é definido em termos de si mesmo.Não é difícil inserir dentro de um subprograma uma chamada ao próprio subprograma. O que é difícil é reconhecer situações em que são apropriadas as chamadas recursivas" - (pagina 38 do livro de Collins descrito como bibliografia básica).

Veja os exemplos a seguir.

Program Fatorial;
var
begin
end.

No exemplo anterior não utilizamos nenhuma função nem recursividade.Acredito que você já tinha descoberto isto.

Agora no exemplo a seguir introduziremos neste programa uma função recursiva. Veja como ficará.

Program Fatorial;
var
function f(n:integer):real;
begin
end;
begin
end.

Novamente nosso programa principal está um pouco, ou talvez bastante defeituoso, não testa nada dos valores de entrada.

Mas o que nos preocupa no momento é com a recursividade.

Voltamos a ela. Quando no programa principal for executado o comando j:=f(n) a função começará a ser executada com o valor de n, digamos que n tenha valor 4.

O comando f:=f(3)*n será executado, só que este comando chama novamente a função, ou seja, ele não poderá ser executado porque tem que calcular o f(3).

Mas quando o f(3) for ser calculado, faltará executar novamente a função para f(2), que por sua vez faltará executar a f(1), que no caso não é recursiva e está definida como 1.

Nesta altura na memória do computador tem uma "pilha" de comandos não resolvidos que poderão agora ser executados, uma vez que o computador tendo o valor de f(1) poderá calcular f(2). Tendo f(2) poderá calcular f(3). Tendo f(3) poderá agora calcular f(4). Que assim calculou o fatorial de 4.

Simples, não! Quando uma função ou procedimento é chamado, o endereço de memória de retorno, é salvo para possibilitar o retorno de resultados após a chamada.

Como é possivel uma função ou procedimento chamar a si mesmo, é a recursividade, o computador necessita salvar também as variáveis locais e outras coisinhas mais, ou seja ele vai empilhando tudo isto em memória.

Tente usar a recursividade para este problema.

O jogo "Torres de Hanoi", temos 3 hastes: A, B e C. Temos também um número de discos de diferentes tamanhos. Inicialmente todos os discos estão enfiados na haste A, com o maior em baixo, em seguida o próximo maior, e assim por diante. O objetivo do jogo é mover todos da haste A para B; A haste C é usada para armazenamento temporário. As regras do jogo são: 1. Somente um disco pode ser movido de cada vez. 2. Nenhum disco pode ser colocado sobre um disco menor. 3. Qualquer disco pode ser movido de qualquer haste para qualquer outra haste, desde que respeitada a regra 2.

BOM DIVERTIMENTO.

Você já esta cansado? Quer seguir para a proximo capítulo, ou que parar?