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

标签 rust immutability

以下函数计算 mandelbrot fractal 所需的轨道数“转义”的初始值:

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 的值。因此,要么你有一个可变的位置来存储每一个,要么你需要空间来存储所有这些。

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

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));
}

关于rust - 如何在不递归的情况下删除此 mandelbrot 函数中的可变变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40260132/

相关文章:

variables - 是否可以在 Rust 中使用 match 初始化不可变变量?

javascript - Redux 不只是美化了全局状态吗?

closures - 类型变量中的闭包特征界限与高阶函数参数中的闭包特征界限

javascript - Immutable.js 的实际案例是什么?

python - 困惑为什么在第二次评估不可变字符串的 += 运算符后不会更改 Python3 中的 id

javascript - Array.map() 的函数式编程

rust - 在当前范围内找不到类型 `generate_keypair` 的名为 `secp256k1::Secp256k1` 的方法

rust - 我如何创建一个简单的基本单例?

multithreading - 如何在执行期间使用所有处理器内核?

rust - 如何将 Rust 闭包转换为 C 风格的回调?