Rustに挑戦するために「新しいプログラミング言語を学ぶための15のエクササイズ」に取り組んでいきます。挑戦内容の邦訳Qiita記事を見つけました。
今回の課題
フィボナッチ数列を出力!
エクササイズとしてよくみるフィボナッチ数列に取り組みます。今回は、50番目までの数としました。
コード
main.rs
// 表示桁数の問題があるので50回で止めます
fn main() {
let mut a: i64 = 1;
println!("{}", a);
let mut b: i64 = 1;
println!("{}", b);
for _ in 2..50 {
println!("{}", a + b);
let a_old = a;
a = b;
b = a_old + b;
}
}
コメントでも書きましたが、50番目までとしています。
ポイント
フィボナッチ数列のポイントは、いくつかあります。
* 再帰を用いてはいけない
* 型に注意(i32では50回より前に上限に達する)
* temporaryな変数を用意した
* 所有権について
ポイント解説:再帰
一般的な再帰で解くと計算量が膨大になって凄まじい時間がかかります。対処法は色々ありますが、今回は愚直に足し算しました。
ポイント解説:型
i32の上限は20億くらいなので、i32だと50番目に達する前に上限を超えます。
ポイント解説:temporaryな変数a_oldについて
今回はtemporaryな変数a_oldを用意しました。フィボナッチ数列をどう書くかは言語ごとに変わるためこれで正しいのかはよくわかっていません。
Go言語なんかはかなりシンプルに書けますね。
ポイント解説:所有権について
Rustの習得で難しそうな所有権ですが、i64はプリミティブ型なので、所有権の問題は発生しません。
まとめ
フィボナッチ一つとっても学ぶことは多い。