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  
fo_11

Duvida funcao recorsiva

Recommended Posts

fo_11

Tenh de calcular o maximo de um array atraves de uma função recursiva que possui o seguinte protótipo:int Maximo(int *v, int tam);

Estou com alguma dificuldade alguem me pode dar umas luzes?

Aqui está o código que já está escrito mas não faz o que pretendo repete sempre o segundo elemento do array:

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

int Max(int*,int);

int main()
{
    int v[5],tam=5,i;
    for(i=0;i<tam;i++)
     {printf("Insira numero:");
      scanf("%d",&v[i]);
     }
    printf("Maximo==>%d\n",Max(v,tam));
    system("pause");
}

int Max(int *v,int dim)
{
    int x;
    
    if(dim>1)
      x=Max(v++,--dim);
      
    if(x>*v)
     return x;
    else
     return *v;
}
    

Share this post


Link to post
Share on other sites
Strabush

Na main() é suposto ser assim:

Max(&v, tam);

Pois na função recebes um apontador.

Btw, o programa corre? Onde está o problema, caso saibas?

Share this post


Link to post
Share on other sites
fo_11

Mas v é um array logo tambem é um apontador... Por isso quando coloco v como parametro ele irá passar o seu endereço...

EDIT:Sim o programa corre mas não faz o que deveria fazer que era devolver o maior do array ao  invés disso retorna sempre o segundo elemente se este for maior que o primeiro

Share this post


Link to post
Share on other sites
Localhost

A função que determina o máximo está mal feita.

Primeiro testas se o elemento actual é maior que o max actual, depois é que verificas se atingiste o fim do array.

Algo como isto:

if(*v > *max) *max = *v;
if(v == &dim) return;
max(++v,max);

No meu caso max é um ponteiro para ser mais fácil de perceber. Não testei mas podes fazê-lo tu.

dim: Ponteiro que contém o endereço da última posição do array.

max: Ponteiro vai contêr o máximo no final.

v: ponteiro que percorre o array.


here since 2009

Share this post


Link to post
Share on other sites
DVD

O teu problema é que estás a avançar com o ponteiro e tas a decrementar o tamanho, isso não percorre o array todo.

A maneira mais facil de fazer algoritmos recursivos é simplesmente descrever aquilo que farias se tivesses a pensar em resolver eu neste caso fazia:

- É o ultimo elemento? Sim retorno

- guardar este elemento para comparacao

- Calcular o maior com o resto do array

int max(int * v, int size)
{
if(size == 1) return v[0];

int maxtmp = max(v,size--);

return maxtmp > v[size] ? maxtmp : v[size];
}

Share this post


Link to post
Share on other sites
Localhost

O teu problema é que estás a avançar com o ponteiro e tas a decrementar o tamanho, isso não percorre o array todo.

@DVD, estavas a referir-te ao meu código? Acho que o meu está a funcionar.


here since 2009

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.