为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
沧海一幻觉 2023-03-29 15:19:34
所以我的朋友给了我这个任务,其中必须使用递归来计算正数的平方和。条件 - 输入将是一个用空格分隔的数字的字符串这是我到目前为止所做的,但这显示了一个runtime error.这是完整的错误https://ideone.com/53oOjNpackage mainimport(    'fmt',    'strings',    'strconv')var n int = 4var sum_of_squares int = 0func 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)}
查看完整描述

3 回答

?
莫回无

TA贡献1865条经验 获得超7个赞

递归的经验法则是终止条件。它应该存在,并且应该存在于正确的位置。


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在某个地方。您只需将它传递给下一个函数调用。


查看完整回答
反对 回复 2023-03-29
?
墨色风雨

TA贡献1853条经验 获得超6个赞

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

}

这更快并且只扫描整数,并跳过所有其他不寻常的字符。


查看完整回答
反对 回复 2023-03-29
?
qq_笑_17

TA贡献1818条经验 获得超7个赞

我喜欢保持简单。我也有一些 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)


}


查看完整回答
反对 回复 2023-03-29
  • 3 回答
  • 0 关注
  • 101 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信