gpt4 book ai didi

performance - 为什么我的递归 Fibonacci 实现与迭代实现相比如此缓慢?

转载 作者:行者123 更新时间:2023-11-29 07:52:06 27 4
gpt4 key购买 nike

我创建了以下简单的斐波那契实现:

#![feature(test)]
extern crate test;

pub fn fibonacci_recursive(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fibonacci_recursive(n - 1) + fibonacci_recursive(n - 2)
}
}

pub fn fibonacci_imperative(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => {
let mut penultimate;
let mut last = 1;
let mut fib = 0;
for _ in 0..n {
penultimate = last;
last = fib;
fib = penultimate + last;
}
fib
}
}
}

我创建它们是为了试用 cargo bench,所以我编写了以下基准测试:

#[cfg(test)]
mod tests {
use super::*;
use test::Bencher;

#[bench]
fn bench_fibonacci_recursive(b: &mut Bencher) {
b.iter(|| {
let n = test::black_box(20);
fibonacci_recursive(n)
});
}

#[bench]
fn bench_fibonacci_imperative(b: &mut Bencher) {
b.iter(|| {
let n = test::black_box(20);
fibonacci_imperative(n)
});
}
}

我知道递归实现通常比命令式实现慢,特别是因为 Rust 不支持尾递归优化(这个实现无论如何都不能使用)。但是没想到下面差了将近2000倍:

running 2 tests
test tests::bench_fibonacci_imperative ... bench: 15 ns/iter (+/- 3)
test tests::bench_fibonacci_recursive ... bench: 28,435 ns/iter (+/- 1,114)

我使用最新的 Rust nightly 编译器 (rustc 1.25.0-nightly) 在 Windows 和 Ubuntu 上运行它并获得了相似的结果。

这种速度差异是否正常?我写的东西“错”了吗?还是我的基准有缺陷?

最佳答案

正如 Shepmaster 所说,您应该使用累加器来保留先前计算的 fib(n - 1)fib(n - 2) 否则您将继续计算相同的值值(value)观:

pub fn fibonacci_recursive(n: u32) -> u32 {
fn inner(n: u32, penultimate: u32, last: u32) -> u32 {
match n {
0 => penultimate,
1 => last,
_ => inner(n - 1, last, penultimate + last),
}
}
inner(n, 0, 1)
}

fn main() {
assert_eq!(fibonacci_recursive(0), 0);
assert_eq!(fibonacci_recursive(1), 1);
assert_eq!(fibonacci_recursive(2), 1);
assert_eq!(fibonacci_recursive(20), 6765);
}

last 等同于 fib(n - 1)
倒数第二个 等同于fib(n - 2)

关于performance - 为什么我的递归 Fibonacci 实现与迭代实现相比如此缓慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49052327/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com