Implementando a Recursividade - Pascal/Delphi - Clube do Hardware
Implementando a Recursividade
Por hagtha_lana, 9 de setembro de 2013 em Pascal/Delphi
hagtha_lana 0
Camacari,Bahia
Galera, boa noite! me chamo Luana e estou novamente a frequentar o clubedohardware após um tempinho.
Sou estudante de SI, e estou no 2º semestre, preciso elaborar um trabalho referente a Implementação a recursividade porém não tenho noção do que isso seja. Realizando algumas pesquisas na net vejo que é uma função que permite chamar a si mesma, mas não consegui captar ainda a lógica dela? não entendi a diferença de usar uma função recursiva para um comando de repetição (FOR, WHILE, etc)
quando devo usar uma função recursiva ao invés de um comando de repetição?
Alguém pode, por favor me ajudar?
Conto com a colaboração de todos e desde já agradeço!
Ótima: noite para todos e aguardo retorno!
Olá hagtha_lana,
Recursividade e repetição são coisas diferentes.
A recursividade consiste resumidamente em um procedimento chamar a si mesmo, ou seja, exatamente da mesmo forma que se tivesse chamando um outro procedimento qualquer, a diferença é que "esse outro procedimento" seria um clone do atual. Sacou? Por exemplo, se tivéssemos um procedimento chamado Fatorial(), ao si chamar, seria como se existisse outro procedimento com o nome Fatorial2(), que é um clone do anterior... se Fatorial2() chamara si mesmo, teria outro clone Fatorial3()...
Assim como normalmente ocorre, ao chamar um procedimento qualquer, o programa vai "entrar" nesse procedimento, e ao terminar, vai voltar exatamente no ponto onde ele foi chamado. Uma característica especial no uso de recursividade é que ao usar parâmetro por valor (sem o var), cada procedimento vai usar o valor recebido sem influência no valor original. Daí, ao efetuar alguma mudança e chamar novamente a si mesmo, o próximo procedimento terá novos valores próprios, que não interagem com o valor que foi passado.
Em fim, a minha sugestão é que você pegue códigos na internet e tente entender o funcionamento...
procedure hanoi(n:integer;a,b,c:char);
{mova n discos do pino a para o pino b usando o pino c como auxiliar}
writeln('mova o disco ',n,' do pino ',a,' para o pino ',
hanoi(n-1,a,c,;
writeln('mova o disco ',n,' do pino ',a,' para o pino ',;
write  ('Informa a quantidade de discos da torre de Hanoi: ');
Tente simular os passos que seriam seguidos pelo Pascal utilizando 2 discos... Lembrando que toda vez que um procedimento é chamado, deve ser guardado o valor da variável que está no procedimento atual. Ex.:
Ao chamar o hanoi(n,'A','B','C');, o procedimento terá os valores 2,'A','B','C', correto? Lá no procedimento, if o "n-1" vai dar false, logo vai chamar o procedimento hanoi() (ele mesmo), logo poderíamos chamar de hanoi2()... esse procedimento, terá os valores 1,'A','C','B' (veja que as variáveis estão em outra ordem, e os valores seguiram eles).
Logo, até nesse ponte já teríamos:
Fanoi()
N=2, a='A', b='B' e C='C';
Fanoi2()
N=1, a='A', b='C' e C='B';
Por ai vai... daí compare se os valores chegados por essa simulação estão batendo com os gerados com o programa.
Por enquanto, não precisa entender porque
Tá dando para entender? Cada procedimento é como se fosse "um programa"... também conhecido como "sub-programas"... Se chamar outro, cria um novo, se terminar, volta exatamente para o procedimento anterior, e com os respectivos valores... após entender esse funcionamento, ficará mais fácil entender porque está si chamando de duas formas de diferentes dentro dele mesmo...