在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
}
答案 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)
}
}