Arrays golang中使用递归的数组平方和

Arrays golang中使用递归的数组平方和,arrays,go,recursion,Arrays,Go,Recursion,所以我的朋友给了我这个任务,其中正数的平方和必须使用递归计算 条件-输入将是一个带有空格分隔数字的字符串 这就是我到目前为止所做的,但这显示了一个运行时错误 下面是全部错误 递归的经验法则是终止条件。它应该存在,应该存在于正确的地方 func sumOfSquares(strArray []string, iterate int) int{ if iterate >= len(strArray) { return sum_of_squares }

所以我的朋友给了我这个任务,其中正数的平方和必须使用递归计算
条件-输入将是一个带有空格分隔数字的字符串
这就是我到目前为止所做的,但这显示了一个
运行时错误


下面是全部错误


递归的经验法则是终止条件。它应该存在,应该存在于正确的地方

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)
}
这样你就不需要在某处存储
平方和。您只需将其传递给下一个函数调用

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开始,因此将长度减少1

正如@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
}
var inp[]字节
var loc int
inp,Util=ioutil.ReadFile(文件名)
//添加\n以便我们不会超出界限,
//如果最后一个字节是整数。
inp=append(inp,“\n”)
func scanit()(res int){
如果loc57;loc++{
}
对于;inp[loc]>47和&inp[loc]<58;loc++{

res=res我喜欢保持简单。我也有一些if条件,但希望你喜欢

func sumOfSquares(numArr []string) int {
    i, err := strconv.Atoi(numArr[0])

    rest := numArr[1:]

    //Error checking
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
        return 0
    }

    square := i * i

    // negative & last number
    if i < 0 && len(rest) == 0 {
        return square
    }

    // negative & not last number
    if i < 0 && len(rest) > 0 {
        return sumOfSquares(rest)
    }

    // last man standing
    if i >= 0 && len(rest) == 0 {
        return square
    }

    return square + sumOfSquares(rest)

}
func-sumOfSquares(numar[]字符串)int{
i、 错误:=strconv.Atoi(numar[0])
剩余:=努马尔[1:]
//错误检查
如果错误!=零{
fmt.Println(错误)
操作系统退出(1)
返回0
}
正方形:=i*i
//负数&最后一个数字
如果i<0&&len(rest)==0{
返回广场
}
//负数&不是最后一个数
如果i<0&&len(rest)>0{
返回平方米(剩余)
}
//站着的最后一个人
如果i>=0&&len(rest)==0{
返回广场
}
返回正方形+三方形(其余)
}

演示:

发布错误SIR它只显示运行时错误。它还显示
索引超出范围
-不仅仅是
运行时错误
。打印存储在
平方和中的值
结果
请将实际代码发布到问题,并指出代码所在的行。这里的代码有语法错误。When语法错误已修复,恐慌指向问题行。从那里,应该很容易看到问题。@peterSO更新了答案,但他确实提到,输入将是带有空格分隔值的字符串。
func sumOfSquares(numArr []string) int {
    i, err := strconv.Atoi(numArr[0])

    rest := numArr[1:]

    //Error checking
    if err != nil {
        fmt.Println(err)
        os.Exit(1)
        return 0
    }

    square := i * i

    // negative & last number
    if i < 0 && len(rest) == 0 {
        return square
    }

    // negative & not last number
    if i < 0 && len(rest) > 0 {
        return sumOfSquares(rest)
    }

    // last man standing
    if i >= 0 && len(rest) == 0 {
        return square
    }

    return square + sumOfSquares(rest)

}