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

igorsouza2012

Recursividade

Mensagens Recomendadas

igorsouza2012

Peço desculpas por novamente estar aqui pedindo ajuda de vocês, mas é que recursividade não esta entrando na minha cabeça de jeito nenhum. :wallbash:

eu consegui fazer um programa com recursividade de media.

No entanto nao to conseguindo fazer uma para ler os numeros de um vetor e dizer se sao todos pares ou não.

(Tenho que retornar 1 caso todos sejam pares e 0 caso contrario.)

Nao to conseguindo ir a lugar nenhum. Sera que alguem podeme ajudar?

  😳

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Só queres uma função que percorra o array e que veja se são todos pares ou queres uma função que leia os números para um array?


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
igorsouza2012

Quero uma que percora o array e veja se os numeros sao pares...

Se possivel mande ele comentado porque eu to precisando aprender a fazer e nao somento entregar o trabalho.

Grato pela ajuda  :thumbsup:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Atenção, eu não te vou dar um código. Vou tentar explicar.

Basicamente tens de criar uma função que se chame a ela própria e que receba um ponteiro (que vai percorrer o array) e cada vez que se chama incrementas esse ponteiro (aritmética de ponteiros) numa unidade para ir para a próxima posição no array. Tens também de verificar se o ponteiro está no final do array, se estiver significa que todos são pares porque também tens uma condição que verifica se o elemento actual é ímpar, se for retornas -1 ou algo assim parecido.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Então só precisas de ter uma variável que vai servir para indexares o array.

Vou-te dar um exemplo muito sucinto disto:

if(array[k] % 2 != 0) return -1;
if(k == size) return 1;
even(array,size,++k);


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
igorsouza2012

Eu cheguei nisso aqui...

e nao to achando o erro...

int par (int vet[5],int pos)
{     
      int pares=0;
      if((pos==5)&&(vet[5]%2!=0))
      {
            return 1;
      }
      else
      {
          pares=par(vet,pos+1);
          {
             return 0;
             }
      }                
         return pares;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
igorsouza2012

Realmente eu nao entendi cara...

Tem como você ajeitar o meu codigo ou me manda um pronto pra eu dar uma olhada como realmente é e refazer esse antes de continuar fazendo os outros???

ta aqui o meu codigo completo.

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

int par (int vet[5],int pos)
{     
      int pares=0;
      if (vet[5]%2!=0)
      {
            return -1;
      }
      if (pos==5)
      {
            return 1;
            }
            
      else
      {
          pares=par(vet,pos+1);
      }                
         return pares;
}
      
      
      
int main(void)
{   int vet[5],i,p;
    for (i=0;i<5;i++)
    {
        printf("Digite o valor na possicao %i\n",i);
        scanf("%i",&vet[i]);
    }
    p=(par,0);
    printf("%i",p);
    if (p==0)
    {
               printf("Todos os numeros sao pares!\n");
    }
    else
    {
               printf("Nem todos os numeros sao pares!\n");
    }
    system("PAUSE");
return 0;
}

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
igorsouza2012

if(array[k] % 2 != 0) return -1;

if(k == size) return 1;

even(array,size,++k);

Eu nao entendi porque retornar -1.

k== size  nao deveria retornar 0 para que a funçao chegasse no fim?

esse even ai seria o que ?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

Desculpa, eu não li a parte em que disseste que se não fossem todos pares retornava 0. Considera como se fosse 0 aquele -1.

O even seria a chamada à função que receberia, respectivamente, "um array" (os outros percebem as aspas), o tamanho desse array e a variável que percorre o array. A variável que percorre o array tem de ser aumentada a cada chamada.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Eu acho que vocês estão aí a fazer coisas a mais, vejo demasiados ifs para uma coisa que deve resumir-se a 2 casos:

- o caso de paragem

- o caso em que se constrói uma parte do resultado e se invoca a função novamente, mas com novos parâmetros.

Penso que o objectivo aqui é utilizar a operação && para realizar uma operação de booleanos, os quais resultam da avaliação da paridade de cada elemento do vector. Para tal, basta:

- no caso de paragem, testar se já se atingiu o fim do vector. Nesse caso, deve-se devolver o valor 1 (porque se trata de um &&. Caso não compreendas, sugiro que faças uma tabela de verdade para perceberes).

- no caso recursivo, testa-se se o elemento em questão é par e invoca-se a função passando o mesmo vector, e no 2º parâmetro, passa-se então o inteiro que serve para jogar com o tamanho do array/índexagem, mas alterado em 1 unidade.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Baderous

Lol, pois é, nem reparei. É do hábito de não fazer funções recursivas em C. Pronto, fica a explicação na mesma.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
igorsouza2012

Galera estou quase desistindo desse exercicio.

Por favor me passem essa funçao para eu dar uma olhada nao aguento mais.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
Localhost

@igorsouza2012, tens de ter calma.

Tu ainda não percebeste o meu exemplo? A mim parece-me é que ainda não percebeste outras coisas, com o meu exemplo já conseguias criar a função porque supostamente sabias criar o cabeçalho da mesma.


here since 2009

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
igorsouza2012

Realmente não estou entendendo nada de recursividade.

Ta complicado... Vo ler algumas coisas por aqui.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
igorsouza2012

Cara consegui fazer o programa...  :cheesygrin:muito obrigado pela ajuda... ^^

fico assim a função...

int par (int vet[3],int pos)
{
    if ((pos==3) || (vet[3]%2!=0))
    {
                 return 0;
                 }
    else
    {
        if (vet[pos]%2==0)
        {
                          return 1;
                          }
        else
            return 0;
    }
    return par(vet,pos+1);
}

Muito obrigado pela paciencia !!!  :thumbsup:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
igorsouza2012

Eu tinha feito um teste para cada tipo ai funciono, masdepois que voce falo eu fui testar mais e ta dando erro  😳

Agora sim eu consegui...

int par(int vet[3], int pos)
{
    int pares;
if (pos==3)
{
    if (vet[3]%2!=0)
    {
          return 0;
     }
     else
     {
          return 1;
          }
}
    else
    {
        if (vet[pos]%2==0)
        {
            pares=par(vet,pos+1);
            return pares;
            }
        else
        {
            return 0;
            }
     }
     return pares;
}

:thumbsup:

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.