Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

Sign in to follow this  
igorsouza2012

Recursividade

Recommended Posts

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?

  😳

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
igorsouza2012

Esqueci de comentar...

:thumbsup:

Meu professor nao ensino nada de ponteiro ainda  😳

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other sites
Localhost

Tenta perceber o exemplo que te dei, se não perceberes diz que eu explico melhor.


here since 2009

Share this post


Link to post
Share on other 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;
}

Share this post


Link to post
Share on other 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 ?

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites
Localhost

Eu fico é um bocado confuso com aqueles return's com chamadas recursivas. :bored:


here since 2009

Share this post


Link to post
Share on other sites
Baderous

Pois, eu como estou habituado ao lazy evaluation do Haskell, isso a mim não me faz confusão nenhuma. :thumbsup:

Share this post


Link to post
Share on other sites
Localhost

Bah, um dia vou ter de ler algo sobre recursividade. :thumbsup:


here since 2009

Share this post


Link to post
Share on other sites
igorsouza2012

Galera estou quase desistindo desse exercicio.

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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites
igorsouza2012

Realmente não estou entendendo nada de recursividade.

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

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other sites
Localhost

Tens a certeza de que isso está a dar os resultados correctos?


here since 2009

Share this post


Link to post
Share on other 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:

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.