2
respostas

Exercício de Algoritmo Java Problema 4 (recursivo)

Problema 4 (recursivo)

Crie um programa que produza o resultado da operação de adição / subtração de entrada.

• Todos os números a serem inseridos são inteiros. • Use "+" (soma) e "-" (diferença) como símbolos aritméticos. • A fórmula da operação deve realizar pelo menos uma operação e pode realizar uma pluralidade de operações. • Assumindo a notação da operação de quatro regras, a operação a ser executada primeiro deve ser incluída entre "(" e ")", e a estrutura aninhada também é possível. [Correto: 23 + 58 + 7 - (10 + 3) - (3 - (5 + 4 - (8 - 2)))] • Incluindo números negativos. No caso de um número negativo, insira adicionando "-" (menos) sem inserir um espaço em branco imediatamente antes do valor numérico, e o intervalo do valor numérico é de -10000 a 10000. • O inverso do valor que pode ser obtido no meio da operação é de -10000 a 10000.

Exemplo de entrada

23 + 58 + 7- (10 + 3) - (3 --2- (5 + 4- (8 --2) + 8)))

Exemplo de saída

85

Resposta / Explicação:

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // Importar parâmetros de entrada
        String input = br.readLine();
        String[] param = input.split(" ");//Valor de entrada em branco
        int sum = calc(param,0,param.length - 1) ;
        System.out.println(sum);
    }

    public static int calc(String[] param, int startIdx, int endIdx){
        int sum = 0 ;
        String type = null ;
        for(int idx = startIdx ; idx < endIdx + 1 ; idx ++){
            if(param[idx].equals("+") || param[idx].equals("-")){
                type = param[idx] ;
            }else if(param[idx].equals("(")){
                int endOfFormula = checkEndOfFormula(param,idx) ;//③
                if(type != null){
                    if(type.equals("+")){
                       sum = sum + calc(param, idx + 1 , endOfFormula - 1);//①
                    }else if(type.equals("-")){
                       sum = sum - calc(param, idx + 1 , endOfFormula - 1);//②
                    }
                }else{
                    sum = calc(param, idx + 1 , endOfFormula - 1) ;
                }
                idx = endOfFormula ;
            }else{
                int num = Integer.parseInt(param[idx]);
                if(type != null){
                    if(type.equals("+")){
                        sum = sum + num;
                    }else if(type.equals("-")){
                        sum = sum - num;
                    }
                }else{
                    sum = num ;
                }
            }
        }
        return sum ;
    }

    //Encontre o final dos parênteses "("
    public static int checkEndOfFormula(String[] param, int startIdx){
        int end = startIdx + 1;
        int startCount = 0 ;
        for(int idx = startIdx + 1 ; idx < param.length; idx ++){
            end = idx ;
            if(param[idx].equals("(")){
                startCount ++ ;//④
            }else if(param[idx].equals(")")){
                if(startCount == 0){
                    break ;
                }else{
                    startCount -- ;//⑤
                }
            }
        }
        return end ;
    }
}
2 respostas

• ①, ② Chame o método calc () recursivamente. No caso deste problema, é necessário primeiro resolver a forma de pensar.

Por exemplo, ao considerar a entrada "7 - (5 - 2)", se você calcular na ordem da esquerda, o número a ser subtraído de 7 é (5 - 2), então o cálculo de 5 - 2 é executado primeiro Deve ser feito.

Claro, () pode ser aninhado, portanto, há uma possibilidade de subdivisão adicional.

Portanto, o processo de análise da fórmula de cálculo é dividido no método calc (), e se "(" for encontrado nele, o método calc () é usado para calcular a parte até o final de "(" separadamente. I irá criar um processo recursivo denominado "chamada".

O método calc () retorna um resultado passando uma matriz de parâmetros e subscritos no início e no final do cálculo.

Olá Dorgival! Tudo bem?

Estou gostando muito dos seus posts!

Fazer dessa maneira ajuda bastante quem está aprendendo e dando os primeiros passos na linguagem, e você mesmo por treinar os conhecimentos que já possui!

Inclusive, eu te recomendo divulgar conhecimento além do nosso fórum também em artigos, pode ser muito legal produzir artigos com essas resoluções que você vem trazendo aqui pra nós, e alcançaria ainda mais pessoas!

Poderia ser em plataformas como Dev.to ou Medium.

É só uma sugestão... e por favor, continue compartilhando conhecimento conosco aqui no fórum!😄