这个Python代码最接近的等效Rust代码是什么?
a, b = 1, 2
a, b = b, a + b
Run Code Online (Sandbox Code Playgroud)
我正在尝试编写一个迭代的Fibonacci函数.我有Python代码我想转换为Rust.一切都很好,除了交换部分.
def fibonacci(n):
if n < 2:
return n
fibPrev = 1
fib = 1
for num in range(2, n):
fibPrev, fib = fib, fib + fibPrev
return fib
Run Code Online (Sandbox Code Playgroud)
She*_*ter 22
交换变量时,您最想要的是为和创建新的绑定.ab
fn main() {
let (a, b) = (1, 2);
let (b, a) = (a, a + b);
}
Run Code Online (Sandbox Code Playgroud)
但是,在您的实际情况中,没有一个很好的解决方案.如上所述,您始终为a和创建新绑定b,但您希望修改现有绑定.我所知道的一个解决方案是使用临时的:
fn fibonacci(n: u64) -> u64 {
if n < 2 {
return n;
}
let mut fib_prev = 1;
let mut fib = 1;
for _ in 2..n {
let next = fib + fib_prev;
fib_prev = fib;
fib = next;
}
fib
}
Run Code Online (Sandbox Code Playgroud)
你也可以这样做,以便你改变元组:
fn fibonacci(n: u64) -> u64 {
if n < 2 {
return n;
}
let mut fib = (1, 1);
for _ in 2..n {
fib = (fib.1, fib.0 + fib.1);
}
fib.1
}
Run Code Online (Sandbox Code Playgroud)
您可能还有兴趣交换两块内存的内容.99%以上的时间,你想要重新绑定变量,但是你想要在很短的时间内"改变"事物:
fn main() {
let (mut a, mut b) = (1, 2);
std::mem::swap(&mut a, &mut b);
println!("{:?}", (a, b));
}
Run Code Online (Sandbox Code Playgroud)
请注意,执行此交换并不简洁,只需一步即可将这些值相加.
也可以看看:
此外,在Rust中实现Fibonacci序列的更好方法是使用Iterator特征:
// Iterator data structure
struct FibIter(u32, u32);
// Iterator initialization function
fn fib() -> FibIter {
FibIter(0u32, 1u32)
}
// Iterator trait implementation
impl Iterator for FibIter {
type Item = u32;
fn next(&mut self) -> Option<u32> {
*self = FibIter(self.1, self.1 + self.0);
Some(self.0)
}
}
fn main() {
println!("{:?}", fib().take(15).collect::<Vec<_>>());
}
Run Code Online (Sandbox Code Playgroud)
请参阅迭代器的Rust Programming Language 一章.
| 归档时间: |
|
| 查看次数: |
6926 次 |
| 最近记录: |