recursividade de uma função

Fórum sobre a linguagem CA-Clipper.

Moderador: Moderadores

lapinha
Usuário Nível 1
Usuário Nível 1
Mensagens: 13
Registrado em: 29 Dez 2007 22:01
Localização: Portugal

recursividade de uma função

Mensagem por lapinha »

Amigos clippeiros muito bom dia.
Estou tentando fazer o somatório de 5+4+3+2+1=15
Em que 5 é o nº máximo, mas também pode ser outro.
Eu fiz esta pequena rotina mas não me funciona.
Alguém me pode ajudar.



procedure main()
n=0
@ 10,10 say "qual o n§ maior?" get n
read
soma(n)

function soma(n)
sum=0
? "estou aqui"
IF n=0
sum=sum+0
? sum
else
sum=n+soma(n-1)

ENDIF
? sum

o muito obrigado
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Código: Selecionar todos

function Soma(n)
return if(n>0, n+Soma(n-1), 0)
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Avatar do usuário
Pablo César
Usuário Nível 7
Usuário Nível 7
Mensagens: 5312
Registrado em: 31 Mai 2006 10:22
Localização: Curitiba - Paraná

Recursividade de uma função

Mensagem por Pablo César »

A sua indicação está corretíssima, Maligno o interessante que após o número 90 compilado com 5.2e+RTLINK e após o número 132 com 5.3+BLINKERdá "Unrecoverable error 650: Processor stack fault". Deve ser estouro de pilha.

Agora o mais interessante é entender como é feito esse procedimento. Fiz uma alteração para tentar expor a minha dúvida, ficando o código assim:

Código: Selecionar todos

cls
do while .t.
   n=0
   @ 10,10 say "qual o n§ maior?" get n
   read
   if lastkey()=27
      exit
   endif
   ? soma(n)
enddo

function Soma(n)
if n>0
   vret:=n+Soma(n-1)
else
   vret:=0
endif
return vret
Compile com opção /B e executei com o CLD. O que eu não entendo como esse processamento se dá repetidas vezes (claro que o valor de n de decremental) e pára quando atingir 0 (zero) ?. Visto que não está em nenhum looping ou laço de repetição. É um tanto curioso, ele executar o SOMA() de forma aninhada até estabelecer o valor ZERO, não é ?
Um clip-abraço !

Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Avatar do usuário
Maligno
Membro Master
Membro Master
Mensagens: 6398
Registrado em: 06 Jul 2004 01:40
Localização: Londrina/PR

Mensagem por Maligno »

Pablo César escreveu:após o número 90 compilado com 5.2e+RTLINK e após o número 132 com 5.3+BLINKERdá "Unrecoverable error 650: Processor stack fault". Deve ser estouro de pilha.
Correto. Por isso nunca é bom abusar da recursividade.
O que eu não entendo como esse processamento se dá repetidas vezes (claro que o valor de n de decremental) e pára quando atingir 0 (zero) ?.
Você não entendeu por quê pensou Soma() como uma função só. Imagine que são várias. O retorno zero é um flag que existe apenas para garantir que haja um retorno a partir de certo ponto, senão a recursividade não teria fim. Mas em síntese,...

Código: Selecionar todos

function Soma(n)
return if(n>0, n+Soma(n-1), 0)

As chamadas serão desta forma:
(A) 5 + Soma(5-1)
(B)     4 + Soma(4-1)
(C)         3 + Soma(3-1)
(D)             2 + Soma(2-1)
(E)                 1 + Soma(1-1) // começa o retorno
                    
Os retornos:
(E) 1 + 0 = 1
(D)     2 + 1 = 3
(C)         3 + 3 = 6
(B)             4 + 6 = 10
(A)                 5 + 10 = 15
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.

---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Responder