Skip to content

Commit 4a1bf01

Browse files
committed
feat: improve fibonacci example
1 parent 8d7ed50 commit 4a1bf01

4 files changed

Lines changed: 65 additions & 5 deletions

File tree

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
use crate::fibonacci::{Fibonacci, Iter};
2+
3+
pub struct Dynamic {
4+
data: Vec<i64>,
5+
}
6+
7+
impl Dynamic {
8+
pub fn new() -> Self {
9+
return Dynamic { data: vec![1, 1] };
10+
}
11+
}
12+
13+
impl Fibonacci for Dynamic {
14+
fn fibonacci(&mut self, n: usize) -> i64 {
15+
match self.data.get(n) {
16+
Some(v) => *v,
17+
None => {
18+
let v = self.fibonacci(n - 1) + self.fibonacci(n - 2);
19+
self.data.insert(n, v);
20+
v
21+
}
22+
}
23+
}
24+
}
25+
26+
impl<'a> IntoIterator for &'a mut Dynamic {
27+
type Item = i64;
28+
29+
type IntoIter = Iter<'a, Dynamic>;
30+
31+
fn into_iter(self) -> Self::IntoIter {
32+
Self::IntoIter{n: 0, generator: self}
33+
}
34+
}

fibonacci-1/src/fibonacci/mod.rs

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,30 @@
1-
use crate::fibonacci::rec::Recursive;
1+
use crate::fibonacci::{dynamic::Dynamic, rec::Recursive};
22

3+
mod dynamic;
34
mod rec;
45

56
pub trait Fibonacci {
6-
fn fibonacci(&self, n: i32) -> i64;
7+
fn fibonacci(&mut self, n: usize) -> i64;
8+
}
9+
10+
pub struct Iter<'a, T: Fibonacci> {
11+
n: usize,
12+
generator: &'a mut T,
13+
}
14+
15+
impl<'a, T: Fibonacci> Iterator for Iter<'a, T> {
16+
type Item = i64;
17+
18+
fn next(&mut self) -> Option<Self::Item> {
19+
self.n += 1;
20+
Some(self.generator.fibonacci(self.n - 1))
21+
}
722
}
823

924
pub fn choose(name: &str) -> Box<dyn Fibonacci> {
1025
match name {
1126
"recursive" => Box::new(Recursive {}),
27+
"dynamic" => Box::new(Dynamic::new()),
1228
_ => panic!("no such a fibonacci implementation named {}", name),
1329
}
1430
}

fibonacci-1/src/fibonacci/rec.rs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
1-
use crate::fibonacci::Fibonacci;
1+
use crate::fibonacci::{Fibonacci, Iter};
22

33
pub struct Recursive {}
44

55
impl Fibonacci for Recursive {
6-
fn fibonacci(&self, n: i32) -> i64 {
6+
fn fibonacci(&mut self, n: usize) -> i64 {
77
if n == 0 || n == 1 {
88
1
99
} else {
1010
self.fibonacci(n - 1) + self.fibonacci(n - 2)
1111
}
1212
}
1313
}
14+
15+
impl<'a> IntoIterator for &'a mut Recursive {
16+
type Item = i64;
17+
18+
type IntoIter = Iter<'a, Recursive>;
19+
20+
fn into_iter(self) -> Self::IntoIter {
21+
Self::IntoIter{n: 0, generator: self}
22+
}
23+
}

fibonacci-1/src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ use crate::fibonacci::choose;
33
mod fibonacci;
44

55
fn main() {
6-
let r = choose("recursive");
6+
let mut r = choose("dynamic");
77

88
println!("{}", r.fibonacci(10));
99
}

0 commit comments

Comments
 (0)