Rust斐波拉契数列

斐波那契数列(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);
}

性能测试结果如下,速度变快了不少

原文地址:https://www.cnblogs.com/qisong/p/14513044.html