From 8d0782d3631cf94b5a6033140df61559ab0d672e Mon Sep 17 00:00:00 2001 From: Xu Shaohua Date: Mon, 24 Jul 2023 10:43:02 +0800 Subject: [PATCH] math: Tuning fib(), remove cache vector --- math/benches/fibonacci.rs | 4 ++-- math/src/fibonacci.rs | 30 +++++++++++++----------------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/math/benches/fibonacci.rs b/math/benches/fibonacci.rs index a2db1aaf..fe60bb73 100644 --- a/math/benches/fibonacci.rs +++ b/math/benches/fibonacci.rs @@ -2,11 +2,11 @@ // Use of this source is governed by General Public License that can be found // in the LICENSE file. -use criterion::{criterion_group, criterion_main, Criterion}; +use criterion::{black_box, criterion_group, criterion_main, Criterion}; use math::fibonacci::fib; pub fn fib_bench(c: &mut Criterion) { - c.bench_function("fib 80", |b| b.iter(|| fib(80))); + c.bench_function("math::fib-80", |b| b.iter(|| fib(black_box(80)))); } criterion_group!(benches, fib_bench); diff --git a/math/src/fibonacci.rs b/math/src/fibonacci.rs index db9edb75..344a4879 100644 --- a/math/src/fibonacci.rs +++ b/math/src/fibonacci.rs @@ -18,24 +18,20 @@ pub const MAX_INDEX: u8 = 93; /// # Errors /// Returns error if `num` is not a possitive integer. pub fn fib(num: u8) -> Result { - if num > MAX_INDEX { - return Err(FibError::IllegalIndex); + let mut a = 0; + let mut b = 1; + match num { + 0 => Ok(0), + num if num > MAX_INDEX => Err(FibError::IllegalIndex), + _ => { + for _ in 1..num { + let c = a + b; + a = b; + b = c; + } + Ok(b) + } } - if num == 0 { - return Ok(0); - } - if num == 1 { - return Ok(1); - } - - let num = num as usize; - let mut buf: Vec = vec![0; num + 1]; - buf[0] = 0; - buf[1] = 1; - for i in 2..=num { - buf[i] = buf[i - 1] + buf[i - 2]; - } - Ok(buf[num]) } #[cfg(test)]