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

所以我的朋友给了我这个任务,其中必须使用递归来计算正数的平方和。

条件 - 输入将是一个用空格分隔的数字的字符串

这是我到目前为止所做的,但这显示了一个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)

}


沧海一幻觉
浏览 104回答 3
3回答

莫回无

递归的经验法则是终止条件。它应该存在,并且应该存在于正确的位置。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在某个地方。您只需将它传递给下一个函数调用。

墨色风雨

package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "strconv"&nbsp; &nbsp; "strings")var n intfunc sumOfSquares(strArray []string, iterate int) int {&nbsp; &nbsp; number, _ := strconv.Atoi(strArray[iterate])&nbsp; &nbsp; if iterate == n {&nbsp; &nbsp; &nbsp; &nbsp; return number * number&nbsp; &nbsp; }&nbsp; &nbsp; return ((number * number) + sumOfSquares(strArray, iterate+1))}func main() {&nbsp; &nbsp; str := "1 2 3 4"&nbsp; &nbsp; strArray := strings.Fields(str)&nbsp; &nbsp; n = len(strArray) - 1&nbsp; &nbsp; result := sumOfSquares(strArray, 0)&nbsp; &nbsp; fmt.Println(result)}索引从 0 开始,因此长度减一。正如@peterSO 指出的那样,如果字符串包含不寻常的字符,它就不起作用,我没有发布获取输入的正确答案,因为你似乎是初学者,但你可以阅读输入,而不是像这样。var inp []bytevar loc intinp, _ = 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) {&nbsp; &nbsp; if loc < len(inp) {&nbsp; &nbsp; &nbsp; &nbsp; for ; inp[loc] < 48 || inp[loc] > 57; loc++ {&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; &nbsp; &nbsp; for ; inp[loc] > 47 && inp[loc] < 58; loc++ {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; res = res<<3 + res<<1 + (int(inp[loc]) - 48)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }&nbsp; &nbsp; return}这更快并且只扫描整数,并跳过所有其他不寻常的字符。

qq_笑_17

我喜欢保持简单。我也有一些 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)}
打开App,查看更多内容
随时随地看视频慕课网APP