Rust:Fibonacci - halmk/Library GitHub Wiki
フィボナッチ数列の様々な書き方をまとめる
- メイン関数
fn main(){
let n:i32 = read();
let res:i32 = fib(n);
println!("{}", res);
}- O(2^n):愚直な実装
fn fib(x: i32) -> i32 {
match x {
0 => 1,
1 => 1,
_ => fib(x-2) + fib(x-1),
}
}- O(n):fib(x-1)+fib(x-2)->fib(x)のボトムアップ
fn fib(x: i32) -> i32 {
fn func(a: i32, b: i32, c: i32) -> i32 {
if c < 2 { return a; }
func(a+b, a, c-1)
}
func(1, 1, x)
}- O(n):動的計画法
fn fib(x: i32) -> i32 {
let mut f1 = 1;
let mut f2 = 1;
let mut tmp = 0;
for _ in 0..x-1 {
tmp = f1 + f2;
f1 = f2;
f2 = tmp;
}
tmp
}- O(n):メモ化再帰
const MAX: usize = 100000;
fn fib(x: usize, memo: &mut Vec<usize>) -> usize {
if x < 2 { return 1; }
if memo[x] != 0 {
return memo[x];
}
memo[x] = fib(x-1,memo) + fib(x-2,memo);
return memo[x];
}fn main(){
let n:usize = read();
let mut memo: Vec<usize> = vec![0;MAX];
let res = fib(n, &mut memo);
println!("{}", res);
}