我正在尝试编写一个函数,当我调用它时,返回数组数组的平均值(平均值)。这是我到目前为止所做的,但现在对于为什么这不起作用一无所知。有什么建议?
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 :(得分:2)
有两个问题:
for i in arr
枚举数组元素,而不是数组索引。
因此,您要添加i
而不是arr[i]
运行总和(arr[i]
可能会因索引超出范围异常而崩溃。)var average = (average / arr.count)
定义了一个局部变量
在if-block的范围内,它隐藏了具有相同名称的外部变量。换句话说,该分配不会修改
最终从函数返回的average
变量。修复这两个问题
func average(arr: [Int]) -> Int{
var average = 0
var counter = 0
for elem in arr {
average = elem + average
counter = counter + 1
if(counter == arr.count){
average = (average / arr.count)
}
}
return 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
}
答案 1 :(得分:0)
每个循环中都不需要计数器。 你也不能两次声明你的平均变量只是在开始时初始化它一次。 试试
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
}
答案 2 :(得分:0)
一般来说,你不需要整数的均值,因为它不是真正的意思。
ex:[2,3]的平均值会用整数吐出2
您也可以使用reduce函数简化代码。
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)
}