Dúvida com recursiva

3 respostas
R

Estou com um problema em recursiva.
Estou tentando fazer este exercício S = (n/2) + ((n-1)/4) - ((n-2)/2) + ((n-3)/4)...+ ou -(1/(2 ou 4)), porém sempre quando eu faço, o valor sai errado porque na recursiva ele acaba fazendo a conta da direita para a esquerda.
Como eu posso fazer ele ficar da esquerda para direita, ou numa maneira que saia o mesmo resultado?
Por exemplo:
n = 4
S = (4/2) + ((4-1)/4) - ((4-2)/2) + ((4-3)/4)
[color=red]=>[/color] S = (4/2) + (3/4) - (2/2) + (1/4) [color=red]=>[/color] S = (2) + (0.75) - (1) + (0.25) [color=red]=>[/color] S = 2.75 - 1 + 0.25 [color=red]=>[/color] S = 1.75 + 0.25 [color=red]=>[/color] S = 2
Com a recursiva ele faz o cálculo assim:
n = 4
S = (4/2) +
S = (3/4) -
S = (2/2) +
S = (1/4)

-------------------
S = 2 +
S = 0.75 -
S = 1 +
S = 0.25

-------------------
S = 2 +
S = 0.75 -
S = 1 + 0.25 = 1.25

--------------------
S = 2 +
S = 0.75 - 1.25 = -0.5

---------------------
S = 2 - 0.5 = 1.5
---------------------

Esse é o problema ele faz a conta da Direta para a esquerda.
Meu código é:

import javax.swing.JOptionPane;
public class EXFat03 {
    public static void main (String args[]){
        double n;
        int z = 0;
        
        n = Double.parseDouble(JOptionPane.showInputDialog("Colocar o valor de n"));
        
        System.out.println("O resultado é " +sfat(n,z));
    }
    
    public static double sfat(double num, int z){
        double s = 0;
        
        
        if (num == 1){
            if ( z == 0){
                return (num/2);
            }
            else if ( z == 1 ){
                return (num/4); 
            }
        }
        else {
            if (z == 0){
                s =  (num/2) + (sfat(num -1, z +1));
            }
            else if (z == 1){
                s = (num/4) - (sfat(num -1, z -1));
           }
        }
        return s;
    }

Podem me ajudar?
Tem que ser em recursiva esse exercício.

Obs: Eu usei o 4 como exemplo, mas se eu colocar outros valores ele pode as vezes bater e as vezes não.

3 Respostas

R

Ninguém pode me ajudar?

A

rafa11, infelizmente não entendi a lógica que utilizou.

Procure sempre dar nomes expressivos para suas variáveis para quem ler seu código entender o que acontece.

Pela sua demonstração, me parece que está tendo problema para alternar entre soma/subtração.

Para ficar mais simples, ao invés de somar e subtrair, você pode simplesmente somar sempre, alternando o sinal de cada parte a partir do segundo.

A fórmula ficaria: S(N) = N/2 * 1 + (N-1)/4 * 1 + (N-2)/2 * -1 + (N-3)/4 * 1

Fiz por cima com esse código abaixo, tenta adaptar com a sua lógica:

public static double s( double n, int divisor, int sinal, int termo) {
		if ( n == 0 ) { 
			return 0;
		} else {
			
			double proximoN = n - 1;
			int proximoDivisor = termo % 2 == 0 ? 2 : 4;
			int proximoSinal = termo % 2 == 0 ? -1 : 1;

			return (n / divisor * sinal ) + s( proximoN, proximoDivisor, proximoSinal, ++termo  );
			
		}		
	}
P

Camarada, fiz um código parecido com o seu , veja se era o seu objetivo:

public class EXFat03 {  
	static  double soma=0;
	static int z=2;
	public static void main (String args[]){  
		double n;  

		n = Double.parseDouble(JOptionPane.showInputDialog("Colocar o valor de n"));  
		resultado(n);

		System.out.println("O resultado é " +soma); 
		
	}  

	public static void resultado(double n){

		if(n>0){
			System.out.println(n/z);
			if(z==2)
			{
				System.out.println("+");
				soma+=n/z;
				z=4;
			}
			else{
				System.out.println("-");
				soma-=n/z;
				z=2;
			}
			resultado(n-1);
		}
	}
Criado 19 de abril de 2012
Ultima resposta 20 de abr. de 2012
Respostas 3
Participantes 3