嗨这个函数接受一个带有一些整数的数组,我的目标是得到一个只有正整数的新数组。但是,我一直得到同样的错误,说恐慌:运行时错误:索引超出范围
任何人都可以帮帮我.. ??
func domath(newarray[] int, i int, array[] int)([]int){
if i < len(newarray) {
if newarray[i] < 0{
i ++
domath(newarray, i, array)
}
if newarray[i] >= 0 {
array = append(array, newarray[i])
i ++
domath(newarray, i, array)
}
}
return array
}
答案 0 :(得分:2)
该实现的问题在于它在第一个if块内递增i然后使用new i值在第二个if块上检查newarray [i]&gt; = 0,所以当你调用domath时(a,x,b)x = len(a)-1它试图做新的[x + 1](即newarray [len(newarray)])超出范围。
你可能想写一些类似的东西:
func domath(newarray []int, i int, array []int) []int {
if i < len(newarray) {
if newarray[i] < 0 {
return domath(newarray, i+1, array)
}
if newarray[i] >= 0 {
array = append(array, newarray[i])
return domath(newarray, i+1, array)
}
}
return array
}
算法的简化版本可能是:
func domath(newarray []int, i int, array []int) []int {
if len(newarray) == i {
return array
}
if newarray[i] >= 0 {
array = append(array, newarray[i])
}
return domath(newarray, i+1, array)
}
然而,您可能应该使用更像惯用的实现,如下所示,也会更快:
func domath(ns []int) []int {
var ps []int
for _, n := range ns {
if n >= 0 {
ps = append(ps, n)
}
}
return ps
}
答案 1 :(得分:0)
你想写一个递归函数吗?你可以在下面看到我的代码:
func domath(newarray []int, i int, array []int) []int {
if i < len(array) {
if array[i] >= 0 {
newarray = append(newarray, array[i])
}
i++
} else {
return newarray
}
return domath(newarray, i, array)
}
答案 2 :(得分:0)
我解决了这个问题。这是一个简单但常见的错误。由于我们错过了“制作切片或数组”,因此出现了 golang 恐慌错误。例如
package main
import "fmt"
func main() {
var elementNumber int
fmt.Println("How many elements do you want in slice?")
fmt.Scanln(&elementNumber)
storage := make([]int, elementNumber) // this line crucial important.
for i := 0; i < elementNumber; i++ {
fmt.Printf("please enter %d. integer number= ", i+1)
fmt.Scanln(&storage[i])
}
}
如果我可以这样做并且不使用“make”,它就行不通;
package main
import "fmt"
func main() {
var elementNumber int
fmt.Println("How many elements do you want in slice?")
fmt.Scanln(&elementNumber)
storage := []int{}
for i := 0; i < elementNumber; i++ {
fmt.Printf("please enter %d. integer number= ", i+1)
fmt.Scanln(&storage[i])
}
}