Как сделать вывод данных после ввода с использованием рекурсии(без циклов и goto)?

Код запрашивает количество вводов, затем на каждом вводе количество чисел, затем запрашивает сами числа и вычисляет сумму их квадратов. Но программа работает не так как я хотел. Сейчас она выдает ответ в процессе ввода данных. То есть должно быть 3 ввода чисел и 3 ответа, я ввожу данные для первого ответа и программа сразу как получает все данные выдает ответ и ждет данные для следующего ответа. А мне нужно, чтобы программа выдала ответы по очереди после всех вводов, пример того как я хочу:

Input:
2 // Количество вводов, столько же ответов должно быть
3 // Количество чисел в первом вводе
1 2 3 // сами числа, программа должны вычислить сумму их квадратов
2 // кол-о чисел во втором вводе
2 3 // сами числа


Output:
14 // ответ на первый ввод
13 // ответ на второй ввод


Сама программа:
package main

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

func main() {
	reader := bufio.NewReader(os.Stdin)
	fmt.Println("input number")
	n, _ := reader.ReadString('\n')
	n = strings.TrimRight(n, "\r\n")
	test_cases, err := strconv.Atoi(n)
	if err != nil {
		fmt.Println(err)
	}
	process_test_case(test_cases, reader)
}

func process_test_case(test_cases int, reader *bufio.Reader) {
	if test_cases != 0 {
		fmt.Println("int number")
		_, _ = reader.ReadString('\n')
		fmt.Println("integers")
		input, _:= reader.ReadString('\n')
		input = strings.TrimRight(input, "\r\n")
		fmt.Println(input)
		arr := strings.Split(input,  " ")
		ans := process_array(arr, 0)
		fmt.Println("answer =", ans)
		test_cases -= 1
		process_test_case(test_cases, reader)
	}
}

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
	}
}
  • Вопрос задан
  • 243 просмотра
Решения вопроса 1
uvelichitel
@uvelichitel Куратор тега Go
habrahabr.ru/users/uvelichitel
Можно без циклов и без аллокации слайса. Только печатать будет задом наперёд))
func process_test_case(test_cases int, reader *bufio.Reader) {
	fmt.Println("int number")
	_, _ = reader.ReadString('\n')
	fmt.Println("integers")
	input, _ := reader.ReadString('\n')
	input = strings.TrimRight(input, "\r\n")
	arr := strings.Split(input, " ")
	test_cases -= 1

	if test_cases != 0 {
		process_test_case(test_cases, reader)
	}
	fmt.Println("answer =", process_array(arr, 0))
}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
includedlibrary
@includedlibrary
Без циклов никак. Нужно сохранять ответы в массив, а потом их по очереди выводить. Для этого собственно и нужен будет цикл
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы