如何在不递归的情况下删除此 mandelbrot 函数中的可变变量?

How can I remove the mutable variable in this mandelbrot function without recursion?

以下函数计算从 mandelbrot fractal 初始值到 "escape" 所需的轨道数:

extern crate num;

fn mandel_escape(x: f32, y: f32, limit: f32, orbits: u32) -> Option<u32> {
    let c = num::complex::Complex32::new(x, y);
    let mut z = c;
    for i in 0 .. orbits {
        z = z * z + c;
        if z.norm_sqr() > limit { return Some(i); }
    }
    None
}

我知道在 Rust 中不能保证尾调用优化。我如何能够在不递归的情况下删除此函数中的可变变量?

不可能。

您需要在某个时候为每次迭代创建 z 的值。因此,要么您有一个可变位置来存储每个位置,要么您需要 space 来存储所有位置。

不过,您可以将可变性隐藏在迭代器中:

struct MandelIterator {
    c: f32,
    z: f32,
}

fn mandel_iter(c: f32) -> MandelIterator {
    MandelIterator { c: c, z: 0.0 }
}

impl Iterator for MandelIterator {
    type Item = f32;
    fn next(&mut self) -> Option<Self::Item> {
        self.z = self.z * self.z + self.c;
        Some(self.z)
    }
}

fn mandel_escape(x: f32, y: f32, limit: f32, orbits: usize) -> Option<usize> {
    for (i, z) in mandel_iter(x*y).enumerate().take(orbits) {
        if z.abs() > limit { return Some(i); }
    }
    None
}

fn main() {
    println!("{:?}", mandel_escape(1.00001, 1.00001, 40999.0, 4));
}