我在考虑如何在 Rust 中实现 Fibonacci,并认为我可以用 fold
来实现。
我想出的是:
// Editor's note: this code sample predates Rust 1.0 and
// is not valid syntax. The concepts remain valid.
range(2, generations).fold(vec![1u, 1], |data: &mut Vec<uint>, value| {
data.push(data[-2] + data[-1]);
data
}).last()
但是,这不会编译,因为我无法以借用检查器喜欢的方式将 data
放入 fold
中。它要么是不可变的,要么被多次借用,要么最后一个 data
超出范围,我无法将 data
返回到 fold
.
有没有办法将 fold 与 Vec
一起使用?还是我必须求助于循环?
最佳答案
这是 a working version :
fn main() {
let z = (2..12).fold(vec![1u64, 1], |mut data, _| {
data.push(data[data.len() - 2] + data[data.len() - 1]);
data
});
println!("{:?}", z.last())
}
您的方法存在一些问题:
-
data: &mut Vec<uint>
(或现代 Rust 中的usize
)— 您的累加器变量不是“对可变向量的引用”,它只是一个“可变向量”。 -
data[-2]
— Rust 不会隐式地从数组的后面开始索引负值。事实上,索引甚至不接受负值!它想要一个usize
, 所以你的-2
和-1
会变成非常大的数字!
关于iterator - 是否可以将折叠与 Vec 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27760022/