2015-08-04 10 views
7

Was ist das nächste Äquivalent zu diesem Python-Code?Wie man zwei Variablen vertauscht?

a, b = 1, 2 
a, b = b, a + b 

Ich versuche, eine iterative Fibonacci-Funktion zu schreiben. Ich habe Python-Code, den ich nach Rust konvertieren möchte. Alles ist in Ordnung, außer für den Swap-Teil.

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 
+0

Bitte lesen Sie [* The Rust Programmiersprache *] (http://doc.rust-lang.org/stable/book/). Es deckt viele einführende Themen ab. – Shepmaster

+1

@Shempmaster, habe einige Zeit damit verbracht, über [swap] (http://doc.rust-lang.org/std/mem/fn.swap.html) und [replace] (http: //doc.rust-lang. org/std/mem/fn.replace.html) aber ich bin mir nicht sicher, was ich hier brauche. –

Antwort

14

Wenn Variablen tauschen, die am ehesten, was Sie wollen neue Bindungen für a und b erstellen.

fn main() { 
    let (a, b) = (1, 2); 
    let (b, a) = (a, a + b); 
} 

In Ihrem tatsächlichen Fall gibt es jedoch keine nette Lösung. Wenn Sie wie oben beschrieben vorgehen, erstellen Sie immer neue Bindungen für a und b, aber Sie möchten die vorhandenen Bindungen ändern. Eine Lösung, die ich kenne, ist die Verwendung einer temporären:

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 
} 

Man könnte es auch machen, so dass Sie das Tupel mutieren:

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 
} 

Sie auch interessieren können den Inhalt von zwei Stücke in Vertauschen von Erinnerung. 99 +% der Zeit, die Sie wollen die Variablen neu zu binden, aber eine sehr geringe Menge an Zeit, die Sie wollen die Dinge „in place“ ändern:

fn main() { 
    let (mut a, mut b) = (1, 2); 
    std::mem::swap(&mut a, &mut b); 

    println!("{:?}", (a, b)); 
} 

Beachten Sie, dass es nicht präzise ist diese Swap zu tun und füge die Werte in einem Schritt zusammen.

+0

Können Sie näher darauf eingehen, wenn jemand die Dinge an Ort und Stelle ändern oder die Variablen neu binden möchte? Was ist falsch daran, neue Bindungen zu erstellen? Nicht effizient? –

6

Darüber hinaus ist eine bessere Art, die Fibonacci-Folge in Rust zu implementieren wird mit dem Iterator Merkmale:

// 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<_>>()); 
} 

Siehe Die Rust-Programmiersprachechapter on iterators.

Verwandte Themen