###### tags: `leetcode` `rust` # フィボナッチ数列 - https://leetcode.com/problems/fibonacci-number/ フィボナッチ数列問題を Rust で書く。 ### フィボナッチ数列とは フィボナッチ数(一般にF(n)と表記)は、0と1から始まる各数が前の2つの数の和となるようなフィボナッチ数列と呼ばれる数列を形成する。 ``` F(0) = 0, F(1) = 1 F(n) = F(n - 1) + F(n - 2), for n > 1. ``` 入力 n が与えられるので、F(n)を求める。 ## 初期コード fib 関数を完成させる。 ```rust impl Solution { pub fn fib(n: i32) -> i32 { } } ``` - [impl](https://doc.rust-lang.org/std/keyword.impl.html) キーワード - 読み方 -> インプル。 - 構造体にメソッドを追加できる。 ## if 文と関数 - ドキュメント - [関数](https://doc.rust-jp.rs/book-ja/ch03-03-how-functions-work.html) - 関数は、関数内の最後の式を戻り値とする。 - [if/else](https://doc.rust-jp.rs/rust-by-example-ja/flow_control/if_else.html) - if 文は式の一種である。 ### 関数の記述方法(1) - 最後の式を戻り値として評価する。 - return は書かない。セミコロンも書かない。 ```rust= pub fn fib(n: i32) -> i32 { if n == 0 { 0 } else if n == 1 { 1 } else { 2 } } ``` ### 関数の記述方法(2) - if 文を式として評価する書き方。if 文が式なので 8 行目にセミコロンがある。 - 最後の戻り値に return は書かない。セミコロンも書かない。 ```rust= pub fn fib(n: i32) -> i32 { let a = if n == 0 { 0 } else if n == 1 { 1 } else { 2 }; a } ``` ### 関数の記述方法(3) - return で戻り値を書く方法。セミコロンが必要。 ```rust= pub fn fib(n: i32) -> i32 { let a = if n == 0 { 0 } else if n == 1 { 1 } else { 2 }; return a; } ``` ## for 文 - ドキュメント - [for ループ](https://doc.rust-jp.rs/rust-by-example-ja/flow_control/for.html) ### for 文の書き方(基本) - 0 から n - 1 まで ```rust= for i in 0..n { // 処理 } ``` - 0 から n まで ```rust= for i in 0..=n { } ``` ### for 文の書き方(応用) - 添字を使わない場合 - 添字 i を使ってないときは無視するという意味でアンダースコアを使って _i と書く。 _ だけでもよい。 ```rust= for _i in 0..n { } for _ in 0..n { } ``` - 逆順 ```rust= for _ in (0..n).rev() { } ``` - 2 ずつ進む ```rust= for _ in (0..n).step_by(2) { } ``` ## 完成したコード - Rust Playground で動作確認済み。 https://play.rust-lang.org/ ```rust= pub fn fib(n: i32) -> i32 { let mut fib0 = 0; let mut fib1 = 1; if n == 0 { return 0; } for _ in 2..=n { let tmp = fib0 + fib1; fib0 = fib1; fib1 = tmp; } fib1 } #[cfg(test)] mod tests { use super::*; #[test] fn it_works() { assert_eq!(fib(0), 0); assert_eq!(fib(1), 1); assert_eq!(fib(2), 1); assert_eq!(fib(3), 2); assert_eq!(fib(30), 832040); } } ```