斐波那契数列(Fibonacci sequence),又称黄金分割数列,
因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”
指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……
这个数列从第3项开始,每一项都等于前两项之和
第一种方式,递归算法
//递归方法
fn fib_1(n: i32) -> i32 {
profile_fn!(fib_1);
match n {
0 => return 0,
1 => return 1,
_ => return fib_1(n - 1) + fib_1(n - 2),
};
}
这里借助一个性能测试工具,来看看程序实际的运行耗时,工具地址firestorm
引用方式
[dependencies]
firestorm = { version="0.4", features=["enable_system_time"] }
方法调用,求第20位
use firestorm::{bench, profile_fn};
fn main() {
bench("./", test).unwrap();
}
fn test() {
fib_1(20);
}
性能测试结果如下,因为递归算法中存在着大量重复计算步骤,所以非常慢
第二种方式,每一次计算都保存计算的结果,以空间换时间,优化计算速度
//循环 以空间换时间
fn fib_2(n: i32) -> i32 {
profile_fn!(fib_2);
if n == 0 {
return 0;
};
let mut num1 = 0;
let mut num2 = 1;
for _ in 1..n {
let tmp = num1 + num2;
num1 = num2;
num2 = tmp;
}
return num2;
}
同样的调用方式
use firestorm::{bench, profile_fn};
fn main() {
bench("./", test).unwrap();
}
fn test() {
fib_2(20);
}
性能测试结果如下,速度变快了不少