Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

DiogoRibeiro

funçao que retorne o valor de uma sequencia

Mensagens Recomendadas

DiogoRibeiro

Boas, estou a tentar resolver um problema, em que este me pede pra criar uma funçao que retorne o valor de uma sequencia x(n-1)+x(n-2) para n>=2..

eu sei que posso tomar como exemplo a serie de fibonacci, no entanto so encontro soluçoes recursivas.. e eu nao posso resolver por recursividade..

Alguma ajuda??

esta aqui o que fiz...

int fiab( int n){        // funçao da sequencia
int xn0,xn1;
xn0=1;
xn1=1;
for(int i=1; i>=n; i--){
	n=xn0-xn1;
	xn0=xn1;
	xn1=n;
}
return (n);
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

1º como os numeros de fibonacci tens como primeiros numeros definidos como x(0) = 0 e x(1) = 1 ... tens de verificar se o n é 0 ou 1.

2º é mais explícito usares uma iteração em que estás a incrementar o valor de i, simplesmente porque é isso que normalmente fazes quando estás a calcular os números no papel.

pegando no teu código:

unsigned int fiab(unsigned int n){        // o tipo de dados é unsigned int porque a função não está definida para n < 0
  unsigned int xn0 = 0, xn1 = 1;

  if (n == 0)
    return xn0;
  if (n == 1)
    return xn1;

  for(int i=2; i<=n; i++){  // vais iterar entre 2 e n incrementalmente
    n=xn0+xn1;                // tinhas que o operador - ... mas a função é x(n) = x(n-1) + x(n+2)
    xn0=xn1;
    xn1=n;
  }
  return n;
}


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DiogoRibeiro

eu achava que o ' - ' ia estar referente ao (n-1) e nao ao x(n-1) + ..

..

Agora estou a compreender os meus erros :S

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DiogoRibeiro

na funçao que tu colocas-te, nao da o valor pretendido... porque perante a funçao, se colocarmos 4, o programa teria que fazer (4-1)+(4-2)+(4-3)+(4-4)=6... enquanto para qualquer valor que coloque da sempre resultado de 1..

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Quer dizer que a tua função é o somatório de n - a em que a vai de 1 a n?

X(n) = (n - 1) + (n - 2) + ... + (n - n) ?

Não é exactamente isso que representaste no teu post inicial. Aliás, a solução para esse teu problema ainda se torna mais simples. Basta iterares o valor de a e somares a uma variável final:

for (a = 1; a <= n; a++) { x += n - a; }

Assim nem estou exactamente a perceber porque irias querer uma função recursiva... ;)


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

na funçao que tu colocas-te, nao da o valor pretendido... porque perante a funçao, se colocarmos 4, o programa teria que fazer (4-1)+(4-2)+(4-3)+(4-4)=6... enquanto para qualquer valor que coloque da sempre resultado de 1..

vou ter de destruir a minha bola de criatal ... não anda a adivinhar bem o que as pessoas querem ....


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DiogoRibeiro

Sorry, expressei-me mal...

Mas agora acho que deu para entender um pouco melhor!

Mas eu ja tentei assim

for (a = 1; a <= n; a++) { x += n - a; }

e mesmo assim nao deu o resultado que esperava :X

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Qual é o resultado que esperavas? Se é, para n = 4 dar 6, é isso que dá...


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
pedrosorio

Boas, estou a tentar resolver um problema, em que este me pede pra criar uma funçao que retorne o valor de uma sequencia x(n-1)+x(n-2) para n>=2..

eu sei que posso tomar como exemplo a serie de fibonacci, no entanto so encontro soluçoes recursivas.. e eu nao posso resolver por recursividade..

Se bem percebo, tens que programar algo que te devolva os valores da sucessão:

x(0)=a

x(1)=b

x(n)=x(n-1)+x(n-2), para n>=2

Como isto é precisamente a sucessão de fibonnaci para x(0),x(1) arbitrários, a solução iterativa é exatamente a mesma, mas usando valores (passados como parâmetros à função?) para x(0) e x(1). Qual é a dúvida?


Não respondo a dúvidas por mensagem.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Na verdade, o que o DiogoRibeiro quer é isto:

for (i = 1; i < n; i++) result += i;

Só que da forma como ele expressou, que é o somatório de (n - a) em que a vai de 1 até n.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DiogoRibeiro

#include <iostream>
using namespace std;

// funçao da sequencia
  int fiab( int n){

int xn0=1; 
int xn1=2;
int result;

//caso o n seja 0 ele devolve 1 
if (n == 0)
    return xn0;
// caso seja n=1 ele vai devolver 2
else if (n == 1)
    return xn1;
// se nao vai retornar o valor da sequencia  x(n)=x(n-1)+(n-2)+...+(n-n)
else{
  for (int i = 1; i < n; i++) {
   result += i;
  }
}
  return result;
}



int main(){

int aux;
// para que ele peça repetidamente um valor e so pare o programa quando o n=0 ou n=1
do
{
cout << " Introduza um valor  nao negativo:" <<endl;
cin>> aux;

cout << fiab(aux) <<endl;
}while(aux!=0  && aux!=1);

system("pause");
return (0);
}

este e o meu código... e mesmo com o que me disses-te agora KTachyon , da-me um valor negativo para o exemplo do 4  :S

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
DiogoRibeiro

ja inicializei, no entanto agora ele retorna-me o valor que eu coloco >2.. se colocar 2 ele da-me dois, se colocar 3 ele da-me 3  :S

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
HappyHippyHippo

faz a simplificação da função e terás :

(n-1)+(n-2)+(n-3)+...+(n-n-1)+(n-n) =

(n-1)+(n-2)+(n-3)+...+1+0

invertendo a ordem:

0+1+2+3+..+(n-2)+(n-1)

PS : ignora o meu post anterior ...

as contas estao correctas ... tenta com um valor maior e verifica qual o valor de inicializacao do result


IRC : sim, é algo que ainda existe >> #p@p

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
KTachyon

Coloquei int result = 0;, e compilei o código que mostraste e isto foi o resultado que obtive:

ref03:~ KTachyon$ ./a.out
Introduza um valor  nao negativo:
2
1
Introduza um valor  nao negativo:
3
3
Introduza um valor  nao negativo:
4
6
Introduza um valor  nao negativo:
5
10
Introduza um valor  nao negativo:
6
15
Introduza um valor  nao negativo:
7
21
Introduza um valor  nao negativo:
8
28
Introduza um valor  nao negativo:
9
36
Introduza um valor  nao negativo:
1
2
ref03:~ KTachyon$ ./a.out
Introduza um valor  nao negativo:
0
1

Parece-me correcto, à excepção do 1 e do 0 que não deveriam mostrar resultado (acho), mas acontece porque estás a imprimir sem validar o input do utilizador.


“There are two ways of constructing a software design: One way is to make it so simple that there are obviously no deficiencies, and the other way is to make it so complicated that there are no obvious deficiencies. The first method is far more difficult.”

-- Tony Hoare

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.