所以我们的想法是有一个函数返回具有随机系数的 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)
}
很明显,最后一部分并不是表达我们想要返回的其余闭包的有效方式,但我希望你能明白。
您正在寻找总和,因此将您的序列转换为将求和的迭代器。
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()
}
}