42 lines
1016 B
Plaintext
42 lines
1016 B
Plaintext
use std::collections::VecDeque;
|
|
|
|
struct SimpleMovingAverage {
|
|
period: usize,
|
|
numbers: VecDeque<usize>
|
|
}
|
|
|
|
impl SimpleMovingAverage {
|
|
fn new(p: usize) -> SimpleMovingAverage {
|
|
SimpleMovingAverage {
|
|
period: p,
|
|
numbers: VecDeque::new()
|
|
}
|
|
}
|
|
|
|
fn add_number(&mut self, number: usize) -> f64 {
|
|
self.numbers.push_back(number);
|
|
|
|
if self.numbers.len() > self.period {
|
|
self.numbers.pop_front();
|
|
}
|
|
|
|
if self.numbers.is_empty() {
|
|
return 0f64;
|
|
}else {
|
|
let sum = self.numbers.iter().fold(0, |acc, x| acc+x);
|
|
return sum as f64 / self.numbers.len() as f64;
|
|
}
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
for period in [3, 5].iter() {
|
|
println!("Moving average with period {}", period);
|
|
|
|
let mut sma = SimpleMovingAverage::new(*period);
|
|
for i in [1, 2, 3, 4, 5, 5, 4, 3, 2, 1].iter() {
|
|
println!("Number: {} | Average: {}", i, sma.add_number(*i));
|
|
}
|
|
}
|
|
}
|