Como resolver uma sucessão no Java?

Não sei se já foi aberto um tópico sobre isto ou relacionado com isto, mas aqui vai:

Sendo :
t0 = n
ti+1 = 1/2 * (ti + n/ti)

Como eu posso calcular t1, t2, t3… ?

Isto num programa java.

Agradecia uma resposta rápida, obrigado

Vc já tem a fórmula, basta escrevê-la em forma de código. Pelo menos faça uma tentativa antes de obter a resposta, se não vai ser dificil de alguém ajudar.

O problema é:

Considere a sucessão definida por: t0=n, ti+1=1/2 * (ti+n/ti). Calcular os elementos da sucessão t0, t1, t2… enquanto |ti -n/ti |> epsilon*ti . Parar quando se encontra o primeiro elemento que não satisfaz esta condição.

Está aqui o código que eu andei a tentar formar. Quando eu o executo, não dá como eu quero. Já tentei entender porquê, mas não consigo :\

public class Exercicio {
public static void main (String [] args) {

double n = 10;
double epsilon = 0.01;

double t0 = n;
int contador1 = 0;

for (double ti = t0; ((Math.abs (ti - n/ti)) > (epsilon * ti)); ti = (((1/2) * (ti + n/ti)) )) {
for (int i = 0; i <= ti; i++)
System.out.println ("O elemento " + i + " da sucessao ti e " + ti + “.”);

}
}
}

Não há ninguém que me possa ajudar?

Pelo que vi seu código está correto. O que está acontecendo diferente do que vc esperava?

Eu resolvi à mão e, por exemplo, o t1 = 5.
No programa, esse ciclo vai de t0 a t9, e é sempre 9 o resultado. De certeza que estou a fazer alguma coisa mal, não estou a ver é o quê… Alguém com mais experiência no java percebe de certeza o que está errado

Arrumei um pouco seu código. Tinha um for dentro do outro que acho que não servia pra nada, só complicava:

public class Recursiva { public static void main(String[] args) { double n = 5; double epsilon = 0.01; double t0 = n; int i = 0; for (double ti = t0; ((Math.abs(ti - n / ti)) > (epsilon * ti)); ti = ((double) 1 / 2) * (ti + n / ti)) { System.out.println("O elemento " + i + " da sucessao ti e " + ti + "."); ++i; } } }

Para n= 5 o resultado foi:

O elemento 0 da sucessao ti e 5.0.
O elemento 1 da sucessao ti e 3.0.
O elemento 2 da sucessao ti e 2.3333333333333335.

Além disse, repare que fiz um cast na divisão 1/2. Pq eu fiz isso? Teste o seguinte programa:

public class Recursiva { public static void main(String[] args) { // double n = 5; // double epsilon = 0.01; // double t0 = n; // int i = 0; // for (double ti = t0; ((Math.abs(ti - n / ti)) > (epsilon * ti)); ti = ((double) 1 / 2) * (ti + n / ti)) { // System.out.println("O elemento " + i + " da sucessao ti e " + ti + "."); // ++i; // } System.out.println(1 / 2); System.out.println((double) 1 / 2); } }

vc vai ver que ele printa 0 e depois 0.5. Pq isso? pq quando vc divide um inteiro por outro, ele trunca o valor para um inteiro. Ou seja, ele só pega o resultado inteiro da divisão e ignora o resto. Por isso 1/2 deu 0. Já quando eu uso o (double) 1, aí ele considera a parte decimal do número.

Não pude deixar de notar o nome de sua classe: Recursiva. No caso de vc querer fazer recursão, o código poderia ser algo como:

[code]public class Recursiva {
private static final double epsilon = 0.01;
private static final double n = 5;

public static void main(String[] args) {
	recursiva(0, n);
}

public static void recursiva(int i, double ti) {
	if (Math.abs(ti - n / ti) > (epsilon * ti)) {
		System.out.println("O elemento " + i + " da sucessao ti e " + ti + ".");
		recursiva(++i, ((double) 1 / 2) * (ti + n / ti));
	}
}

}
[/code]

[]s

Era mesmo isso que eu queria, acho que o que estava mal era o double que não pus antes de 1/2. Se tivesse posto 0.5 já não tinha esse problema.

Muito obrigada :smiley: