Algoritmo recursivo para calculo do polinômio

11 respostas
programação
M

Gostaria que me ajudasse a desenvolver um método recursivo para cálculo do polinômio. O método precisa receber como parâmetros um array com os coeficientes e o valor de x.

int CalcPoli( int vet[] , int N, int x){
     if (N == 0)
         return 1; 
     else
         return  vet[N-1] * ( CalcPoli(vet, N-1) * x);
}

Fiz dessa forma mais não está funcionando.

11 Respostas

Dragoon

Já tem um problema nessa linha return vet[N-1] * ( CalcPoli(vet, N-1) * x); porque CalcPoli tem três parâmetros e no seu foi passado dois.

Por acaso tem um exemplo com calculo real?

M

Na verdade estou tentando resolver. No caso dos parâmetros você tem razão, mas mesmo assim não funciona.

return vet[N-1]* CalcPoli(vet,N-1,x).

O problema é em relação ao calculo com a potência nesse método recursivo.

Dragoon

Se pode passar o cálculo esperado? Se pode colocar um exemplo no mundo da matemática e como deseja fazer? Se pode dar um exemplo minimo e o resultado esperado?

M

Dado um polinômio:

5x4 - 2x3 +3x-8.

O valor de x = 2

Calculando:

P(2) = 5.2^4 -2.2^3 +0.2^2+3.2^1-8

A solução precisa ser recursiva.

P(2) = 62.
D

Existem várias formas de resolver isso usando recursão, recomendo que tente fazer um modelo matemático.

Este é um exemplo:

N = 0: P0 = P1[0] * x , restante; // restante seria os outros coeficientes, soma todos para obter o resultado
N = 1: P1 = P2[0] * x , P2[1] * x , restante;
N = 2: P2 = P3[0] * x , P3[1] * x , P3[2] * x , restante;

N = "N-1": P{N-1} = PN[0] * x , ... , PN[N-1] * x , restante; // restante será PN[N] neste caso

Simulação

N = 4, P4 = [ 5(*2), -2(*2), 0(*2), 3(*2), -8]
N = 3, P3 = [10(*2), -4(*2), 0(*2),     6, -8]
N = 2, P2 = [20(*2), -8(*2),     0,     6, -8]
N = 1, P1 = [40(*2),    -16,     0,     6, -8]
N = 0, P0 = [    80,    -16,     0,     6, -8]
S = somatória de P0 = 62

Código:

if (N == 0) return somartoria(vet);
if (N > 0) {
  // FAZER recalcular os coeficientes multiplicando x de 0 até N-1
  return CalcPoli(vet, N - 1, x)
}
M
Não consegui implementar da forma como vc me instruiu. No caso poderia calcular assim, mas testei e não deu certo.

if (N > 0)

return x * CalcPoli(vet, N-1, x);

Dá uma analisada e me responde.

D

Falta recalcular os coeficientes multiplicando x de 0 até N-1

Se não conseguiu entender o que sugeri, tente fazer vc mesmo.

if (N > 0) {
  recalcularCoeficientes(vet, N, x);
  return CalcPoli(vet, N - 1, x)
}
M

Veja se consegui chegar onde vc espera.

int SomaVet( int v[],int N) {
    		if (N == 0)
    		 return 0;
    		else
    			
    		 return v[N-1] + SomaVet(v,N-1);
    			
    		       
        }

int RecalcularCoef(int vetor[], int N, int x) {
		if(N == 0)
			return vetor[N];
		return x*RecalcularCoef(vetor, N-1, x);
		
	}
int CalcPoli(int vet[], int N, int x){
		
		if(N == 0)
			return SomaVet(vet, N);
		
	    else
			RecalcularCoef(vet, N, x);
		return CalcPoli(vet, N-1, x);
		
		    
		
	}

Acho que a minha condição de parada no método recalcular coeficiente não está correta.

D

Aquele recalcular, deveria fazer o seguinte:

Simulação:

N = 4, x = 2, vet = [ 5, -2, 0, 3, -8];

vet = [ 5(*x), -2(*x), 0(*x), 3(*x), -8]
vet = [ 5(*2), -2(*2), 0(*2), 3(*2), -8]
vet = [    10,     -4,     0,     6, -8]

depois com N=3

N = 3, x = 2, vet = [10, -4, 0, 6, -8];

vet = [10(*x), -4(*x), 0(*x), 6, -8]
vet = [10(*2), -4(*2), 0(*2), 6, -8]
vet = [    20,     -8,     0, 6, -8]

Quando N = 0, é so somar os coeficientes:

N = 0, vet = [80, -16, 0, 6, -8]
Soma = 80 - 16 + 0 + 6 - 8 = 62
M

O prof André Backes resolveu esse problema da seguinte forma:

int CalcPoli(int vet[ ], int N, int X){
              if(N == 1)
               return vet[0];
              else
                return Math.pow(x,N-1)*vet[N-1]+CalcPoli(vet,N-1,x);
            }

o vetor deverá ser armazenado da seguinte forma: vet[-8,3,0,-2,5]. O índice do vetor ficará sendo o índice do expoente.

D
public static void main(String[] args) {
    int vet[] = {5, -2, 0, 3, -8};
    int x = 2;
    int N = vet.length - 1;
    System.out.println(CalcPoli(vet, N, x));
  }
  static int CalcPoli(int vet[ ], int N, int x){
    System.out.println("N = " + N + ", P" + N + " = " + Arrays.toString(vet));
    if (N == 0) return somatoria(vet, vet.length);
    if (N > 0) {
      multiplicacao(vet, N, x);
      return CalcPoli(vet, N - 1, x);
    }
    return 0;
  }
  static void multiplicacao(int vet[ ], int s, int x){
    if (s == 0) return;
    vet[--s] *= x;
    multiplicacao(vet, s, x);
  }
  static int somatoria(int vet[ ], int s){
    if (s-- == 0) return 0;
    return vet[s] + somatoria(vet, s);
  }
Criado 17 de julho de 2018
Ultima resposta 26 de jul. de 2018
Respostas 11
Participantes 3