Выполнить сумму квадратов чисел без использования цикла for

Я должен найти сумму чисел после выполнения квадратной операции в данном вводе, отрицательные числа нужно игнорировать. Формат ввода: первая строка — это количество тестовых примеров, за которым следует 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 ответ
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)
}

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *