gpt4 book ai didi

rust - 如何用闭包定义相互递归?

转载 作者:行者123 更新时间:2023-11-29 07:59:52 25 4
gpt4 key购买 nike

我可以这样做:

fn func() -> (Vec<i32>, Vec<i32>) {
let mut u = vec![0;5];
let mut v = vec![0;5];

fn foo(u: &mut [i32], v: &mut [i32], i: usize, j: usize) {
for k in i+1..u.len() {
u[k] += 1;
bar(u, v, k, j);
}
}
fn bar(u: &mut [i32], v: &mut [i32], i: usize, j: usize) {
for k in j+1..v.len() {
v[k] += 1;
foo(u, v, i, k);
}
}
foo(&mut u, &mut v, 0, 0);
(u,v)
}

fn main() {
let (u,v) = func();
println!("{:?}", u);
println!("{:?}", v);
}

但我更愿意做这样的事情:

fn func() -> (Vec<i32>, Vec<i32>) {
let mut u = vec![0;5];
let mut v = vec![0;5];

let foo = |i, j| {
for k in i+1..u.len() {
u[k] += 1;
bar(k, j);
}
};
let bar = |i, j| {
for k in j+1..v.len() {
v[k] += 1;
foo(i, k);
}
};
foo(0, 0);
(u,v)
}

fn main() {
let (u,v) = func();
println!("{:?}", u);
println!("{:?}", v);
}

第二个示例未编译并出现错误:未解析的名称 bar。在我的任务中,我可以通过一次递归来完成,但它看起来并不清晰。还有其他建议吗?

最佳答案

我有一个相互递归闭包的解决方案,但它不适用于多个可变借用,因此我无法将其扩展到您的示例。

有一种方法可以使用类似于this answer 的方法来定义相互递归闭包。做单递归。您可以将闭包放在一个结构中,其中每个闭包都借用该结构作为额外参数。

fn func(n: u32) -> bool {
struct EvenOdd<'a> {
even: &'a Fn(u32, &EvenOdd<'a>) -> bool,
odd: &'a Fn(u32, &EvenOdd<'a>) -> bool
}
let evenodd = EvenOdd {
even: &|n, evenodd| {
if n == 0 {
true
} else {
(evenodd.odd)(n - 1, evenodd)
}
},
odd: &|n, evenodd| {
if n == 0 {
false
} else {
(evenodd.even)(n - 1, evenodd)
}
}
};
(evenodd.even)(n, &evenodd)
}

fn main() {
println!("{}", func(5));
println!("{}", func(6));
}

关于rust - 如何用闭包定义相互递归?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34847890/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com