首页 文章

Golang恐慌:运行时错误:索引超出范围

提问于
浏览
1

嗨这个函数采用一些整数的数组,我的目标是有一个只有正整数的新数组 . 但是,我一直得到同样的错误说恐慌:运行时错误:索引超出范围

任何人都可以帮帮我.. ??

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 
}

2 回答

  • 2

    该实现的问题在于它在第一个if块内递增i然后使用new i值在第二个if块上检查newarray [i]> = 0,所以当你调用domath(a,x,b)时x = len(a)-1它试图执行newarray [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
    }
    
  • 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)
    

    }

相关问题