File tree Expand file tree Collapse file tree
Expand file tree Collapse file tree Original file line number Diff line number Diff line change 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+ }
Original file line number Diff line number Diff line change 1- use crate :: fibonacci:: rec:: Recursive ;
1+ use crate :: fibonacci:: { dynamic :: Dynamic , rec:: Recursive } ;
22
3+ mod dynamic;
34mod rec;
45
56pub 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
924pub 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}
Original file line number Diff line number Diff line change 1- use crate :: fibonacci:: Fibonacci ;
1+ use crate :: fibonacci:: { Fibonacci , Iter } ;
22
33pub struct Recursive { }
44
55impl 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+ }
Original file line number Diff line number Diff line change @@ -3,7 +3,7 @@ use crate::fibonacci::choose;
33mod fibonacci;
44
55fn main ( ) {
6- let r = choose ( "recursive " ) ;
6+ let mut r = choose ( "dynamic " ) ;
77
88 println ! ( "{}" , r. fibonacci( 10 ) ) ;
99}
You can’t perform that action at this time.
0 commit comments