2016-12-28 57 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 
}