我可以做這樣的事情:如何用閉包定義相互遞歸?
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
。 在我的任務中,我可以通過一次遞歸來完成,但看起來不太清楚。 有沒有人有任何其他建議?
也許這會更好,如果你在問題標題中指出,問題是互相遞歸? –
謝謝,我只是不知道它是如何被稱爲 – vessd
我很好奇,所以我搜索並找到了這個[關於正常單個遞歸的問題關閉](https://stackoverflow.com/questions/16946888/recursive-closure-in -鏽)。這也不直接支持,雖然這[回答](https://stackoverflow.com/questions/16946888/recursive-closure-in-rust/16953239#16953239)指出了一種方法來通過傳遞函數作爲參數自己。 –