Recursividade em C

PHP, Java, JavaScript, XML, XHTML, HTML, CSS, ASP, Delphi, Assembly, LaTeX, C, UML, Flash, Perl, SQL, Python, Zope, Pascal, WML. Se conhece mais de 3 siglas referidas, este é o forum para si.

Moderadores: Administradores, Moderadores

Recursividade em C

Mensagempor tntnt » Domingo Fev 11, 2007 17:31

Boas!
Tou aqui com uma duvida na implementação de uma função recursiva em C (C puro).

Preciso de uma função ( ex: int soman(int x) ), que utilizando a recursividade, me devolva a soma dos x primeiros multiplos de 3.. Ou seja, insiro 3, o programa devolve o valor 18 (3+6+9).

Podiam dar uma ajudinha? É q ainda tou verde na recursividade... :roll:

cumps
-Asus P5K Pro / Q6600 @ 2400 / 4Gb Kingston HyperX 1066MHz / HD3850 256Mb
-Asus A8N-SLI / A64 X2 3800 @ 2500 @ AC Freezer / 2Gb @ 208 / X1900XT 512Mb @ Accelero X2
http://laestoueuadivagar.blogspot.com/
Avatar do Utilizador
tntnt
Membro Vitalício
Membro Vitalício
 
Mensagens: 2080
Registado: Sábado Mar 18, 2006 1:13
Localização: Pontinha, Lisboa

Mensagempor Moebius » Domingo Fev 11, 2007 18:40

Pseudo código:

usar ciclo for()

enquanto contador inferior a 'x'

verificar se numero actual (digamos z) é divisivel por 3 (usar mod para isto), se sim adicionar ao acumulador, se não ignorar

incrementar.
Acer 7720G - Core 2 Duo T5250 - 2048 Mb RAM - 250 GB HD - 17" WXGA - nVidia Geforce 8400M GS 256 Mb
Shortly will be running on Ubuntu Gnome, Firefox and Thunderbid
Moebius
Membro de Prata
Membro de Prata
 
Mensagens: 136
Registado: Segunda Out 06, 2003 18:28
Localização: Lisboa ou Madeira, conforme o mês do ano

Mensagempor lordanubis » Domingo Fev 11, 2007 19:37

se x=0 retornar resultado
caso contrario
resultado=resultado+(3*y) //y=1,2...
incrementa y
soman(x-1);

tested and working. :wink:
Avatar do Utilizador
lordanubis
Membro de Ouro
Membro de Ouro
 
Mensagens: 723
Registado: Domingo Ago 21, 2005 20:56
Localização: Home@Invicta

Mensagempor stamp » Domingo Fev 11, 2007 21:05

Usando a recursivade, essa solução parece-me mais simples:

int soman(int x)
{
if(x==0)
return 0;
else
return 3*x+soman(x-1);
}
stamp
Novato
Novato
 
Mensagens: 1
Registado: Domingo Fev 11, 2007 20:54

Mensagempor tntnt » Segunda Fev 12, 2007 19:20

Boas!

Obrigado pelas opiniões.

Moebius, o ciclo "for" não é recursivo. Por aí era facil, mas n é isso q pretendo.

lordanubis, stamp: essas ja são recursivas. Será q me poderiam mostrar como ficaria o main, e função e o prototipo (ja com printf, scanf e afins)?!

É q tou um bocado a rasca, e isto é pra quarta...

Obrigadão!

cumps
-Asus P5K Pro / Q6600 @ 2400 / 4Gb Kingston HyperX 1066MHz / HD3850 256Mb
-Asus A8N-SLI / A64 X2 3800 @ 2500 @ AC Freezer / 2Gb @ 208 / X1900XT 512Mb @ Accelero X2
http://laestoueuadivagar.blogspot.com/
Avatar do Utilizador
tntnt
Membro Vitalício
Membro Vitalício
 
Mensagens: 2080
Registado: Sábado Mar 18, 2006 1:13
Localização: Pontinha, Lisboa

Mensagempor Red_Beret » Segunda Fev 12, 2007 23:20

Será isto que queres?

Código: Seleccionar todos
#include <stdio.h>

int somador(int num){
   static int total;
   if(num==0){
      return total;
   }
   else{
      total=total+(3*num);
      return somador(num-1);
   }
}

void main(){
   int numero;
   printf("Numero?\n");
   scanf("%d", &numero);
   printf("%d\n", somador(numero));
}
Imagem
Red_Beret
Membro Vitalício
Membro Vitalício
 
Mensagens: 2334
Registado: Sexta Set 17, 2004 11:13

Mensagempor LuisFilipe » Terça Fev 13, 2007 11:01

Red_Beret Escreveu:Será isto que queres?

Código: Seleccionar todos
#include <stdio.h>

int somador(int num){
   static int total;
   if(num==0){
      return total;
   }
   else{
      total=total+(3*num);
      return somador(num-1);
   }
}

void main(){
   int numero;
   printf("Numero?\n");
   scanf("%d", &numero);
   printf("%d\n", somador(numero));
}


Muito bem Red_Beret mas só uma achega
Não é pouco ortodoxo passar o total sem garantir que foi inicializado ?

A resposta a somador(0) será ? (Barraca ?)

Agora como evitar isso, visto que o total é static (que significa que mantem o valor após sair da função. Hummmmm

Pois o total tem de ser inicializado de alguma forma não é ?

vou pensar um pouco ...
LuisFilipe
Membro Diamante
Membro Diamante
 
Mensagens: 1270
Registado: Domingo Set 04, 2005 22:12

Mensagempor Red_Beret » Terça Fev 13, 2007 12:30

LuisFilipe Escreveu:
Red_Beret Escreveu:Será isto que queres?

Código: Seleccionar todos
#include <stdio.h>

int somador(int num){
   static int total;
   if(num==0){
      return total;
   }
   else{
      total=total+(3*num);
      return somador(num-1);
   }
}

void main(){
   int numero;
   printf("Numero?\n");
   scanf("%d", &numero);
   printf("%d\n", somador(numero));
}


Muito bem Red_Beret mas só uma achega
Não é pouco ortodoxo passar o total sem garantir que foi inicializado ?

A resposta a somador(0) será ? (Barraca ?)

Agora como evitar isso, visto que o total é static (que significa que mantem o valor após sair da função. Hummmmm

Pois o total tem de ser inicializado de alguma forma não é ?

vou pensar um pouco ...
.

Ya tens razão, esqueci-me disso. De qualquer das maneiras, é só por lá o "=0". A static só é inicializada a 1ª vez.

Fica assim

Código: Seleccionar todos
#include <stdio.h>

int somador(int num){
   static int total=0;
   if(num==0){
      return total;
   }
   else{
      total=total+(3*num);
      return somador(num-1);
   }
}

void main(){
   int numero;
   printf("Numero?\n");
   scanf("%d", &numero);
   printf("%d\n", somador(numero));
}


Já agora, ele enviou-me uma MP com isto
Boas Red!

Antes de mais muito obrigado pelo teu tempo!

É mesmo isto q eu queria, mas com uma ressalva: ainda n dei o atributo "static" antes do "int"... E se tiro o static ou igualo a 0, n da certo.
O q posso fazer?

Muito obrigado,

tntnt


Acho que é só declarar o total como int, fora da função, não é? Pelo menos funciona..
Assim:

Código: Seleccionar todos
#include <stdio.h>
int total=0;

int somador(int num){
   
   if(num==0){
      return total;
   }
   else{
      total=total+(3*num);
      return somador(num-1);
   }
}

void main(){
   int numero;
   printf("Numero?\n");
   scanf("%d", &numero);
   printf("%d\n", somador(numero));
}



De qualquer das maneiras, acho que devias entregar uma versão com o static (até porque deve ser isso que o teu prof quer). Dizes que andaste a investigar, e que encontraste o static, que não é mais do que uma variavel que mantem o seu valor entre as várias chamadas da função (o int normal, quando voltas a chamar a função volta a reinicializar-se ao valor que lá está, neste caso 0 (a menos que o inicializes fora da função, como eu fiz))

Agora, o que devias fazer, era pegar neste código, estudá-lo, e tentar fazer o teu próprio programa (principalmente porque a sintaxe que vocês usam deve ser diferente desta sintaxe "Visual Studio" que eu usei)

Nota: tens de melhorar o main, visto que os printf's estão ranhosos, e convém que tenha lá uum if para detectar se poem nºs negativos (é que se passas um nº negativo para a função ela rebenta)
Imagem
Red_Beret
Membro Vitalício
Membro Vitalício
 
Mensagens: 2334
Registado: Sexta Set 17, 2004 11:13

Mensagempor tntnt » Terça Fev 13, 2007 13:11

Obrigado a todos pela ajuda!

cumps
-Asus P5K Pro / Q6600 @ 2400 / 4Gb Kingston HyperX 1066MHz / HD3850 256Mb
-Asus A8N-SLI / A64 X2 3800 @ 2500 @ AC Freezer / 2Gb @ 208 / X1900XT 512Mb @ Accelero X2
http://laestoueuadivagar.blogspot.com/
Avatar do Utilizador
tntnt
Membro Vitalício
Membro Vitalício
 
Mensagens: 2080
Registado: Sábado Mar 18, 2006 1:13
Localização: Pontinha, Lisboa


Voltar para Programação

Quem está ligado:

Utilizador a ver este Fórum: Nenhum utilizador registado e 1 visitante

cron