9

在swift中,我正在尝试编写一种计算平均值的方法。如果我输入 average(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
}
4

10 回答 10

30

只需直接调用以下命令就容易多了reduce

let array = [1.0,2.0,3.0]
var average = array.reduce(0.0) {
    return $0 + $1/Double(array.count)
}
// average = 2.0
于 2015-01-05T19:34:40.943 回答
23

您可以使用数组的 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
}
于 2014-06-09T09:21:45.607 回答
21

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

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)
}
于 2014-06-09T09:45:06.683 回答
5
import Accelerate

let avg = vDSP.mean(array)

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

于 2020-12-04T21:36:00.590 回答
3

只需写count = count +1在你的for循环中。

比如,,,

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

现在通过

var avg:Double = average(5,10,15)
println(avg)
于 2014-06-09T09:20:46.343 回答
2

您忘记在内部循环中增加计数。

于 2014-06-09T09:18:17.563 回答
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)

请注意,我接受双精度数作为输入,而不仅仅是整数。最后我有点冗长,但我正在尝试可读的代码。我可能刚回来:

 return temp/Double(nums.count)

最后并保存了几行代码。

于 2014-06-12T14:53:16.657 回答
1

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

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

于 2014-06-09T12:00:05.473 回答
1

Swift 3,函数式风格

func average(numbers: Int...) -> Double {
    assert(numbers.count > 0)
    return numbers.reduce(0, {$0 + Double($1)})/Double(numbers.count)
}
于 2017-08-17T23:42:06.653 回答
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)
于 2015-01-08T07:39:58.113 回答