es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo encontrar la suma de enteros utilizando recursión (sin bucles) en Golang?

El programa debe solicitar los valores “número de números” y “números” para cada “número de entradas”, las respuestas son la suma de los cuadrados de estos números. Mi código funciona, pero muestra las respuestas en el orden incorrecto, ¿cómo puedo hacer que funcione correctamente? Las salidas deben mostrarse después de todas las entradas.

Creo que es más fácil entender este programa leyendo las entradas y salidas:

Ingresa el número de entradas // salida
2 // entrada
Ingresa el número de números // salida
2 // entrada
Ingresa los números // salida
1 2 // entrada (segunda respuesta)
Ingresa el número de números // salida
2 // entrada
Ingresa los números
2 3 // entrada (primera respuesta)
ans = 13 // ans = 2^2 + 3^2
ans = 5 () // ans = 1^2 + 2^2

Mi código:

package main

import (
    "bufio"
    "fmt"
    "os"
    "strconv"
    "strings"
)

func main() {
    reader := bufio.NewReader(os.Stdin)
    fmt.Println(`Ingresa el número de entradas`)
    n, _ := reader.ReadString('\n')
    n = strings.TrimRight(n, "\r\n")
    test_cases, err := strconv.Atoi(n)
    if err != nil {
        fmt.Println(err)
    }
    procesar_caso_de_prueba(test_cases, reader)
}

func procesar_caso_de_prueba(casos_de_prueba int, reader *bufio.Reader) {
    fmt.Println(`Ingresa el número de números`)
    _, _ = reader.ReadString('\n')
    fmt.Println(`Ingresa los números`)
    entrada, _ := reader.ReadString('\n')
    entrada = strings.TrimRight(entrada, "\r\n")
    arr := strings.Split(entrada, " ")

    casos_de_prueba -= 1

    if casos_de_prueba != 0 {
        procesar_caso_de_prueba(casos_de_prueba, reader)
    }
    fmt.Println("ans =", procesar_arreglo(arr, 0))

}

func procesar_arreglo(arr []string, resultado int) int {
    num, _ := strconv.Atoi(arr[0])
    if len(arr) > 1 {
        siguiente := arr[1:]
        if num < 0 {
            num = 0
        }
        resultado = num*num + procesar_arreglo(siguiente, resultado)
        return resultado
    } else {
        if num >= 0 {
            return num * num
        }
        return 0
    }
}
Tags:  ,

Answer

  1. Avatar for davy.ai

    Para hacer que el programa funcione correctamente y muestre las salidas después de todas las entradas, podemos modificar el código para almacenar las respuestas en un slice y luego imprimirlos una vez que se hayan procesado todas las entradas. Aquí está el código modificado:

    package main
    
    import (
        "bufio"
        "fmt"
        "os"
        "strconv"
        "strings"
    )
    
    func main() {
        reader := bufio.NewReader(os.Stdin)
        fmt.Println(`Ingrese el número de entradas`)
        n, _ := reader.ReadString('\n')
        n = strings.TrimRight(n, "\r\n")
        test_cases, err := strconv.Atoi(n)
        if err != nil {
            fmt.Println(err)
        }
        answers := process_test_cases(test_cases, reader)
        for _, ans := range answers {
            fmt.Println("ans = ", ans)
        }
    }
    
    func process_test_cases(test_cases int, reader *bufio.Reader) []int {
        var answers []int
        for i := 0; i < test_cases; i++ {
            fmt.Println(`Ingrese el número de números`)
            _, _ = reader.ReadString('\n')
            fmt.Println(`Ingrese los números`)
            input, _ := reader.ReadString('\n')
            input = strings.TrimRight(input, "\r\n")
            arr := strings.Split(input, " ")
            sumOfSquares := process_array(arr, 0)
            answers = append(answers, sumOfSquares)
        }
        return answers
    }
    
    func process_array(arr []string, result int) int {
        num, _ := strconv.Atoi(arr[0])
        if len(arr) > 1 {
            next := arr[1:]
            if num < 0 {
                num = 0
            }
            result = num*num + process_array(next, result)
            return result
        } else {
            if num >= 0 {
                return num * num
            }
            return 0
        }
    }
    

    En el código modificado, agregamos una nueva función process_test_cases que toma el número de casos de prueba y el objeto lector, y devuelve un slice de enteros que contiene las respuestas. Dentro de esta función, recorremos el número de casos de prueba y, para cada caso de prueba, procesamos la entrada utilizando la función process_array y agregamos la respuesta al slice de respuestas. Una vez que se han procesado todos los casos de prueba, devolvemos el slice answers.

    En la función main, llamamos a process_test_cases y almacenamos las respuestas en la variable answers. Luego recorremos el slice answers e imprimimos cada respuesta.

    Esto debería producir la salida deseada donde todas las entradas se procesan primero y luego se muestran las respuestas en el orden correcto.

Comments are closed.