2016-12-28 34 views
0

嗨这个函数接受一个整数的数组,我的目标是有一个只有正整数的新数组。但是,我不断收到相同的错误说恐慌:运行时错误:索引超出范围Golang恐慌:运行时错误:索引超出范围

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

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

这似乎你没有处理长度为0的数组 –

回答

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

与实现的问题是,它增加我的第一个if块内然后使用新的i值在第二个if块检查newarray [i]> = 0,所以当你用x = len(a)-1调用domath(a,x,b)时,它会尝试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 
}