2017-02-18 45 views
-4

Я пытаюсь написать функцию, которая, когда я вызываю ее, возвращает среднее значение (среднее) массива чисел. Вот что я до сих пор, но прямо сейчас не понимаю, почему это не сработает. Любой совет?Что случилось с моей средней функцией? in swift

func average(Array arr: [Int]) -> Int{ 
    var average = 0 
    var counter = 0 
    for i in arr{ 

     average = arr[i] + average 
     counter = counter + 1 
     if(counter == arr.count){ 
      var average = (average/arr.count) 
     } 
    } 
    return average 
} 
+0

Что 'i' представляет? – vacawama

+0

'для i в arr', а затем' arr [i] 'выглядят veeeery fishy. И в целом это выглядит как самый длинный и сложный способ подсчета среднего. – luk2302

+0

у вас также есть две отдельные переменные, называемые 'average' – vacawama

ответ

0

Вам не нужен счетчик в a для каждого цикла. также вы не можете объявить свою среднюю переменную дважды, просто инициализируя ее один раз в начале. попробовать

func average(Array arr: [Int]) -> Int{ 
    var avg = 0 
    var sum = 0 
    for i in arr{ 

     sum = i + sum 

    } 
    avg = sum/arr.count 
    return avg 
} 
+0

Спасибо! Вот и все! – BCtopics

2

Есть две проблемы:

  • for i in arr перечисляет массиву элементы, не индексов массива. Поэтому i, а не arr[i] - это то, что вы хотите добавить в сумму (и arr[i] может произойти сбой с исключением из-за пределов диапазона).
  • var average = (average/arr.count) определяет локальную переменную в пределах if-блока, который скрывает внешнюю переменную с тем же именем. Другими словами, это присвоение не изменяет переменную average, которая в конечном итоге возвращается из функции.

Закрепление этих двух вопросов, которые вы получаете

, который работает (но, конечно, обрезает результат до целого из-за используемого целочисленного деления):

print(average(arr: [1, 2, 4])) // 2 

функция может упростить до

func average(arr: [Int]) -> Int{ 
    var sum = 0 
    for elem in arr { 
     sum += elem 
    } 
    return sum/arr.count 
} 

и далее до

func average(arr: [Int]) -> Int{ 
    return arr.reduce(0, +)/arr.count 
} 
0

Как правило, вы не хотите, среднее значение целых чисел, потому что это не истинное среднее.

например: среднее [2,3] будет выплюнуть 2 с целыми

также можно упростить код с функцией уменьшения.

var arr: [Double] = [...] 
if arr.count > 0 { 
    arr.reduce(0, +)/Double(arr.count) 
} 

, насколько ваша функция идет, это должно работать

func average(_ arr: [Double]) -> Double { 
    if arr.count == 0 { return 0 } 
    var average = 0.0 
    for i in arr { 
    average += i 
    } 
    return average/Double(arr.count) 
}