有没有办法在 Rust 中创建一个计算具有随机系数的 n 次多项式的闭包?

问题描述 投票:0回答:1

所以我们的想法是有一个函数返回具有随机系数的 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)
}

很明显,最后一部分并不是表达我们想要返回的其余闭包的有效方式,但我希望你能明白。

rust closures polynomials
1个回答
0
投票

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

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()
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.