- 299 名前:デフォルトの名無しさん mailto:sage [2022/05/23(月) 19:27:40.26 ID:qJLEBqNZ.net]
- >>189
おまえら全員そうだがフィボナッチ数列でusize固定はおかしいだろ コード自体は問題ないが <T: Zero + One + CheckedAdd> を付けろ あとは0と1をT::zero()とT::one()へ置き換えればi8型からBigUintまで何でも動作するようになる https://play.rust-lang.org/?edition=2021&gist=929f3df48db39182558dfad6fe8d1cda さらに今回はfrom_fn()利用をそのままsuccessors()利用へ変換できるので見やすくなる fn fibonacci_iter<T: Zero + One + CheckedAdd>() -> impl Iterator<Item = T> { let mut oq = Some(T::one()); iter::successors(Some(T::zero()), move |p| { let q = oq.take()?; oq = q.checked_add(p); Some(q) }) } ちなみにCloneを要求しないためBigIntなどでも無駄なコスト増とならない >>202 そのコードは暗黙のコピーが発生している from_fn()使用版のコードはcurrがキャプチャ変数なので「let n = curr?;」でコピー発生 successors()使用版のコードはクロージャ引数「|&curr: &usize|」の「&」でコピー発生 usizeならば問題はないがBigIntなどでそのコードは動かないので劣る
|

|