Я должен найти сумму чисел после выполнения квадратной операции в данном вводе, отрицательные числа нужно игнорировать. Формат ввода: первая строка — это количество тестовых примеров, за которым следует N как количество тестовых входов в новой строке, за которым следуют N чисел, разделенных пробелами. Задачу нужно выполнять с помощью golang без использования цикла for. Вывод должен выводиться в новой строке для каждого тестового примера.
3
4
3 -1 1 14
5
9 6 -53 32 16
6
3 -4 12 2 5 7
Ниже представлена моя попытка решить задачу с помощью рекурсии.
package main
import "fmt"
func findSquareSum(x int, a []int, iteration int) {
var num int
if x > 0 {
fmt.Scanf("%d", &num)
if num > 0 {
a[iteration-1] += num * num
}
findSquareSum(x-1, a, iteration)
}
}
func readTest(x int, a []int){
var input int
if x > 0{
fmt.Scanf("%d", &input)
findSquareSum(input,a,x)
readTest(x-1,a)
}
}
func printResult(x int, a []int){
if (x > 0){
fmt.Println(a[x-1])
printResult(x-1,a)
}
}
func main() {
var test int
fmt.Scanf("%d", &test)
a := make([]int, test)
readTest(test,a)
printResult(test,a)
}
Мой вопрос в том, что в рекурсивной функции нет базового случая. Как программа работает в соответствии с ожиданиями?
1 ответ
Есть базовый вариант … это строка if x > 0 {
сравните с версией цикла for
for x=input: x>0: x=x-1 {
findSquareSum(input,a,x)
устанавливает x = input
if x > 0 {
проверка состояния
findSquareSum(x-1, a, iteration)
уменьшает x
также рассмотрите модифицированную функцию
func findSquareSum(x int, a []int, iteration int) {
var num int
if x <= 0 { return }
fmt.Scanf("%d", &num)
if num > 0 {
a[iteration-1] += num * num
}
findSquareSum(x-1, a, iteration)
}
теперь он должен больше походить на базовые случаи, которые мы собираемся увидеть. Также должно быть ясно, что это эквивалентно версии спрашивающего (если только мой синтаксис go не ошибочен!)
по аналогии
func readTest(x int, a []int){
var input int
if x <= 0 { return }
fmt.Scanf("%d", &input)
findSquareSum(input,a,x)
readTest(x-1,a)
}