Сумма квадратов в массиве с использованием рекурсии в Голанге - PullRequest
0 голосов
/ 30 августа 2018

Итак, мой друг дал мне задание, в котором сумма квадратов положительных чисел должна быть вычислена с использованием рекурсии.
Условия - ввод будет строкой с разделенными пробелами числами
Это то, что я дошел до сих пор, но это показывает runtime error.

Вот полная ошибка https://ideone.com/53oOjN

package main
import(
    'fmt',
    'strings',
    'strconv'
)
var n int = 4
var sum_of_squares int = 0
func sumOfSquares(strArray []string, iterate int) int{
    number, _ := strconv.Atoi(strArray[iterate])
    if number > 0 {
        sum_of_squares += number*number
    }
    if iterate == n {
        return 0 // just to end the recursion
    }
    return sumOfSquares(strArray, iterate+1)
}
func main() {
    str := "1 2 3 4"
    strArray := strings.Fields(str)
    result := sumOfSquares(strArray, 0)
    fmt.Println(sum_of_squares, result)
}

Ответы [ 2 ]

0 голосов
/ 30 августа 2018
package main

import (
    "fmt"
    "strconv"
    "strings"
)

var n int

func sumOfSquares(strArray []string, iterate int) int {
    number, _ := strconv.Atoi(strArray[iterate])
    if iterate == n {
        return number * number
    }
    return ((number * number) + sumOfSquares(strArray, iterate+1))
}

func main() {
    str := "1 2 3 4"
    strArray := strings.Fields(str)
    n = len(strArray) - 1
    result := sumOfSquares(strArray, 0)
    fmt.Println(result)
}

Индексирование начинается с 0, поэтому уменьшите длину на единицу.

Как указывало @peterSO, если строки содержат необычные символы, это не работает, я не опубликовал правильный ответ для получения ввода, потому что вы, кажется, начинающий, но вы можете прочитать ввод, как это вместо этого .

var inp []byte
var loc int

inp, _ = ioutil.ReadFile(fileName)
//add \n so that we don't end up running out of bounds,
//if last byte is integer.
inp = append(inp, '\n')


func scanInt() (res int) {
    if loc < len(inp) {
        for ; inp[loc] < 48 || inp[loc] > 57; loc++ {
        }
        for ; inp[loc] > 47 && inp[loc] < 58; loc++ {
            res = res<<3 + res<<1 + (int(inp[loc]) - 48)
        }
    }
    return
}

Это быстрее и сканирует только целые числа и пропускает все другие необычные символы.

0 голосов
/ 30 августа 2018

Основное правило в рекурсии - условие завершения. Он должен существовать, и он должен существовать в нужном месте.

func sumOfSquares(strArray []string, iterate int) int{
    if iterate >= len(strArray) { 
        return sum_of_squares
    }
    number, _ := strconv.Atoi(strArray[iterate]) //TODO: handle err here
    sum_of_squares += number*number

    return sumOfSquares(strArray, iterate+1)
}

Только для вас: каноническая рекурсия не должна сохранять свое состояние в глобальных полях. Я бы предложил использовать следующую функцию подписи.

func sumOfSquares(strArray []string, iterate, currentSum int) int{
    //...    
    return sumOfSquares(strArray, iterate+1, sum_of_squares)
}

Так что вам не нужно хранить sum_of_squares где-то. Вы просто передадите его следующему вызову функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...