Como eu posso fazer para calcular uma PA em Java?

12 respostas
S

Recursivamente…
Eu fiz isso daqui mas deu StackOverFlow… Alguém sabe dizer se pelo menos está certo(tirando a exceção) que deu, e como resolver? Preciso só calcular os termos, recebendo como parâmetro o primeiro termo, a quantidade de número e a razão da PA.

public double calculaPa(int primeiro, int n,
			int razao) {

		int i = 0;
		int resultado = primeiro;

		if (i == n) {
			return 1;
		}

		else{
		return resultado + calculaPa(primeiro + razao, n--,
						razao);
		}
	}

12 Respostas

lucasportela

Isso era pra ser a soma? Se for está errada… está dando StackOverFlow porque entrou em um loop infinito, para corrigir o StackOverFlow você deve usar ‘–n’ ao invés de ‘n–’

A

Coloque --n

E

De qualquer forma, o Java não é muito bom para calcular métodos recursivos se a profundidade da recursividade exceder cerca de 10.000, a menos que você ajuste o parâmetro -Xss.

Mas acho que você não usou n = 10000, certo?

jeffev

entanglement:
De qualquer forma, o Java não é muito bom para calcular métodos recursivos se a profundidade da recursividade exceder cerca de 10.000, a menos que você ajuste o parâmetro -Xss.

Mas acho que você não usou n = 10000, certo?

Bom saber disso!!!

freakazoid

DICA: sempre quando vamos fazer algum método recursivo a primeira coisa é estabelecer uma condição de parada, que no seu caso é:

if (i == n) {
   return 1;
}

Porem existem 2 problemas: o primeiro é que vc em nenhum momento esta incrementando o seu contador i. O segundo é que desta forma sempre quando o método recursivo for chamado, i terá valor 0, isso justifica o java.lang.StackOverflowError!

Uma das soluções é vc colocar o seu contado como parâmetro do seu método e incrementá-lo na chamada recursiva.
Estero que tenha ajudado.

Abs!

sergiotaborda

entanglement:
De qualquer forma, o Java não é muito bom para calcular métodos recursivos se a profundidade da recursividade exceder cerca de 10.000, a menos que você ajuste o parâmetro -Xss.

Mas acho que você não usou n = 10000, certo?

É. como já conversámos em outras threads recursividade é uma coisa a se evitar. Todo o mundo acha que é oitava maravilha, mas não é. Um for é muito melhor.
Existem linguagens como o scala que transforma recursividade em for ( tail recursion) , mas não é o caso do java. Então sempre tente usar for em vez de recurcividade.Em alguns casos é necessário um stack para conseguir o mesmo objetivo com o for.

S

freakazoid:
DICA: sempre quando vamos fazer algum método recursivo a primeira coisa é estabelecer uma condição de parada, que no seu caso é:

if (i == n) {
   return 1;
}

Porem existem 2 problemas: o primeiro é que vc em nenhum momento esta incrementando o seu contador i. O segundo é que desta forma sempre quando o método recursivo for chamado, i terá valor 0, isso justifica o java.lang.StackOverflowError!

Uma das soluções é vc colocar o seu contado como parâmetro do seu método e incrementá-lo na chamada recursiva.
Estero que tenha ajudado.

Abs!

Eu fiz oq disseram acima de botar --n funcionou tudo normal agora, nem precisou mecher no i, pq será?
Outra coisa, a somatá ok, mas como faço agora para mostrar todos os números da PA?

freakazoid

Steam:
freakazoid:
DICA: sempre quando vamos fazer algum método recursivo a primeira coisa é estabelecer uma condição de parada, que no seu caso é:

if (i == n) {
   return 1;
}

Porem existem 2 problemas: o primeiro é que vc em nenhum momento esta incrementando o seu contador i. O segundo é que desta forma sempre quando o método recursivo for chamado, i terá valor 0, isso justifica o java.lang.StackOverflowError!

Uma das soluções é vc colocar o seu contado como parâmetro do seu método e incrementá-lo na chamada recursiva.
Estero que tenha ajudado.

Abs!

Eu fiz oq disseram acima de botar --n funcionou tudo normal agora, nem precisou mecher no i, pq será?
Outra coisa, a somatá ok, mas como faço agora para mostrar todos os números da PA?

Não sei para qual a finalidade vc precisa disso, mas se for apenas exibir a sequencia:

public String calculaPa2(int primeiro, int n, int razao){
		
		int i = 0;
		if (n == i) {
			return ""+primeiro;
		}
		
		return ""+ primeiro +","+  calculaPa2(primeiro + razao, --n, razao);
	}

Abs!

A

Você pode usar o System.out.println(); dentro do seu método ou alterar o seu método para retornar uma String com o cálculo da sua PA, depois vc pode fazer o que vc quiser com a String.

Vc pode passar as informações para sua página web tbm, mas, vc precisa definir se vai usar JSP ou JSF.

Rodrigo_Sasaki

sergiotaborda:
É. como já conversámos em outras threads recursividade é uma coisa a se evitar. Todo o mundo acha que é oitava maravilha, mas não é. Um for é muito melhor.
Existem linguagens como o scala que transforma recursividade em for ( tail recursion) , mas não é o caso do java. Então sempre tente usar for em vez de recurcividade.Em alguns casos é necessário um stack para conseguir o mesmo objetivo com o for.

E ainda depende, para otimizar para tail recursion tem que estar implementado dessa forma. É meio óbvio, mas achei melhor comentar

marcos.after

alvespintoandre:
Você pode usar o System.out.println(); dentro do seu método ou alterar o seu método para retornar uma String com o cálculo da sua PA, depois vc pode fazer o que vc quiser com a String.

Creio que ele quer todos os números contidos na PA, então não seria mais viável utilizar um array para armazenar essa coleção de números para depois imprimir com System.out.println(); ?

freakazoid

inicialmente eu pensei num array mas seria chato pra caramba passar esse cara de parâmetro na recursão…ou não neh?! depende da logica.
achei mais interessante com String.

Criado 7 de fevereiro de 2013
Ultima resposta 8 de fev. de 2013
Respostas 12
Participantes 9