所以我们的 idea 是有一个函数,它返回带有随机系数的n次闭包.例如,这对于比较根查找方法可能很有用,因为我们可以自动创建要计算的函数. 将任何操作附加到闭包的返回将是一个更强大的资源,所以如果有什么方法可以做到这一点,请告诉我.

代码应如下所示:

use rand::Rng;
fn create_func(n: u8) -> impl Fn(f64) -> f64 { 
    let mut cst = vec![];
    for _ in 0..n{
        cst.push(rand::thread_rng().gen_range(0..=20)  as f64);
        // establish the coefficients by randomly generating them
    }
    move |x| cst[0]*x + cst[1]*x.powf(1.) + /*...*/ cst[n- 1]*x.powf(n as f64)
}

所以很明显,最后一部分并不是表达我们want to返回的闭包的其余部分的有效方式,但我希望您能理解.

推荐答案

您正在寻找和,因此将您的序列转换为将被求和的迭代器.

move |x| {
    cst.iter()
        .zip(0..=n as i32)
        .map(|(&c, exp)| c * x.powi(exp))
        .sum()
}

对于每一项,您需要cst(iter)及其指数(zip)中的元素.您可以从这些(map)中一次构造一个术语,然后将所有术语相加(sum).

我还固定了你的词条数量(你的没有x^0个词条),使用了sample_iter个,这比每次都呼叫thread_rng要快.我换成了powi,因为所有的指数都是整数.

pub fn create_func(n: u8) -> impl Fn(f64) -> f64 {
    let cst: Vec<f64> = rand::thread_rng()
        .sample_iter(rand::distributions::Uniform::new_inclusive(0, 20))
        .map(|n| n as f64)
        .take(n as usize + 1)
        .collect();

    move |x| {
        cst.iter()
            .zip(0..=n as i32)
            .map(|(&c, exp)| c * x.powi(exp))
            .sum()
    }
}

Rust相关问答推荐

移植带有可变borrow 的C代码-卸载期间错误(nappgui示例)

在一个tauri协议处理程序中调用一个rectuc函数的推荐技术是什么?

为什么对不可复制数据的引用的取消引用没有O权限来避免Rust中的双重释放?

Rust中的相互递归特性与默认实现

Rust TcpStream不能在读取后写入,但可以在不读取的情况下写入.为什么?

修改切片/引用数组

Box::new()会从一个堆栈复制到另一个堆吗?

函数内模块的父作用域的访问类型

如何将单个 struct 实例与插入器一起传递到Rust中的映射

Rust移动/复制涉及实际复制时进行检测

为什么 tokio 在以奇怪的方式调用时只运行 n 个任务中的 n-1 个?

这是什么:`impl Trait for T {}`?

&'a T 是否意味着 T: 'a?

在线程中运行时,TCPListener(服务器)在 ip 列表中的服务器实例之前没有从客户端接受所有客户端的请求

Rust 中 `Option` 的内存开销不是常量

返回引用字符串的future

我如何将 google_gmail1::Gmail> 传递给线程生成?

将文件的第一行分别读取到文件的其余部分的最有效方法是什么?

如何在 Rust 的泛型函​​数中同时使用非拥有迭代器和消费迭代器?

返回引用的返回函数