@@ -110,6 +110,15 @@ where
110110 }
111111 }
112112
113+ /// 状態`start`から長さ`pow(2, k)`の遷移を返します。
114+ pub fn get ( & self , start : usize , k : usize ) -> & Transition < V > {
115+ assert ! ( start < self . n_state) ;
116+ assert ! ( k <= self . log2_max_steps) ;
117+
118+ let offset = self . n_state * k;
119+ & self . transitions [ offset + start]
120+ }
121+
113122 /// 状態`start`から`step`回の遷移、初期値`init`から始めて`f`で畳みこんだ結果を返します。
114123 pub fn fold < A , F > ( & self , start : usize , step : usize , init : A , mut f : F ) -> A
115124 where
@@ -188,6 +197,25 @@ mod tests {
188197 ) ;
189198 }
190199
200+ #[ test]
201+ fn test_get ( ) {
202+ let n = 3 ;
203+ let to = vec ! [ 1 , 2 , 0 ] ;
204+ let doubling = Doubling :: new ( n, 100 , |i| Transition :: new ( to[ i] , Sum ( 1 ) ) ) ;
205+
206+ let t = doubling. get ( 0 , 0 ) ;
207+ assert_eq ! ( t. value, Sum ( 1 ) ) ;
208+
209+ let t = doubling. get ( 0 , 1 ) ;
210+ assert_eq ! ( t. value, Sum ( 2 ) ) ;
211+
212+ let t = doubling. get ( 0 , 2 ) ;
213+ assert_eq ! ( t. value, Sum ( 4 ) ) ;
214+
215+ let t = doubling. get ( 0 , 3 ) ;
216+ assert_eq ! ( t. value, Sum ( 8 ) ) ;
217+ }
218+
191219 impl Value for String {
192220 fn op ( & self , other : & Self ) -> Self {
193221 format ! ( "{}{}" , self , other)
0 commit comments