2016-12-28 5 views
0

こんにちはこの関数はいくつかの整数で配列をとりますが、私の目標は正の整数で新しい配列を作ることです。しかし、私はパニックを言って同じエラーが発生し続けています:ランタイムエラー:範囲外のインデックスゴランパニック:ランタイムエラー:インデックスが範囲外です

誰かが私を助けてくれる?

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

をその実装に伴う問題は、それが最初の場合はブロック内でIをインクリメントだということです新しいi値を使って2番目の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 
} 
関連する問題