如何在Swift-playground中编写计算平均值的方法

时间:2014-06-09 09:15:57

标签: swift swift-playground

在swift中,我正在尝试编写一种计算平均值的方法。使用下面的方法,如果我输入平均值(5,10,15),我会在swift-playforund中显示无穷大

func average(numbers: Int...) -> Double {
    var sum = 0
    var count = 0
    for number in numbers {
        sum += number
    }
    var  ave : Double = Double(sum) / Double(count)
    return ave
}

11 个答案:

答案 0 :(得分:22)

您可以使用数组的count属性:

func average(numbers: Int...) -> Double {
    var sum = 0
    for number in numbers {
        sum += number
    }
    var  ave : Double = Double(sum) / Double(numbers.count)
    return ave
}

答案 1 :(得分:20)

只需直接调用reduce即可轻松实现:

let array = [1.0,2.0,3.0]
var average = array.reduce(0.0) {
    return $0 + $1/Double(array.count)
}
// average = 2.0

答案 2 :(得分:17)

虽然其他人已经指出了缺失的计数变量,但值得注意的是,通过使用闭包,您可以更优雅地完成平均值:

func averagec(numbers:Int...) -> Double {
    return Double(numbers.reduce(0,combine:+))/Double(numbers.count)
}

为Swift 4编辑: -

func averagec(numbers:Int...) -> Double {
    return Double(numbers.reduce(0,+))/Double(numbers.count)
}

答案 3 :(得分:3)

只需在count = count +1循环中写下for

喜欢,,,

.
.
.
for number in numbers 
{
  sum += number
  count = count +1
}
.
.

现在通过

运行
var avg:Double = average(5,10,15)
println(avg)

答案 4 :(得分:2)

你忘了在内循环中增加计数。

答案 5 :(得分:1)

你得到无穷大因为count总是0 - 它永远不会增加。所以ave变量总是等于0以上的某个数字,这是一个除零误差。

在循环中每次迭代都使用countElements(numbers)或递增计数。

答案 6 :(得分:1)

这就是我的所作所为:

func getAverage(nums: Double...) ->Double
{
    var temp = 0.0
    for num in nums
    {
        temp+=num
    }
    let div = Double(nums.count)
    var average = temp/div
    return average
}
getAverage(21,34.5,28,79)

请注意,我接受双打作为输入,而不仅仅是Ints。我最后有点啰嗦,但我正在尝试使用可读的代码。我可能刚刚回来了:

 return temp/Double(nums.count)

最后并保存了几行代码。

答案 7 :(得分:1)

import Accelerate

let avg = vDSP.mean(array)

这将比到目前为止发布的所有其他解决方案至少快50倍。

答案 8 :(得分:0)

检查此方法。

func averageOf(numbers:Int...)->Float{

    var sum = 0
    for number in numbers{
        sum += number
    }
    return Float(sum)/Float(numbers.count)
}

averageOf(20,10,30)

答案 9 :(得分:0)

Swift 3,功能风格

func average(numbers: Int...) -> Double {
    assert(numbers.count > 0)
    return numbers.reduce(0, {$0 + Double($1)})/Double(numbers.count)
}

答案 10 :(得分:0)

如果您喜欢extension方式!

extension Array where Element == Float {
    var average: Float {
        return isEmpty ? 0 : Float(reduce(0, +)) / Float(count)
    }
}