Recursion Rust中如何通过可变递归数据结构表示迭代

Recursion Rust中如何通过可变递归数据结构表示迭代,recursion,rust,borrow-checker,Recursion,Rust,Borrow Checker,我正在编写迭代搜索递归数据结构的代码,如下所示: struct Tree { payload: i32, children: Vec<Box<Tree>> } fn traverse(n: &mut Tree) { let mut stack: Vec<&mut Tree> = vec![n]; while let Some(x) = stack.pop() { x.payload += 1;

我正在编写迭代搜索递归数据结构的代码,如下所示:

struct Tree {
    payload: i32,
    children: Vec<Box<Tree>>
}
fn traverse(n: &mut Tree) {
    let mut stack: Vec<&mut Tree> = vec![n];
    while let Some(x) = stack.pop() {
        x.payload += 1;
        stack.push(x.children[0].as_mut())
    }
}
到目前为止,我发现表达这种逻辑的唯一方法是:

struct Tree {
    payload: i32,
    children: Vec<Box<Tree>>
}
fn traverse(n: &mut Tree) {
    let mut stack: Vec<&mut Tree> = vec![n];
    while let Some(x) = stack.pop() {
        x.payload += 1;
        stack.push(x.children[0].as_mut())
    }
}
fn遍历(n:&mut树){
让mut堆栈:Vec=Vec![n];
而让一些(x)=stack.pop(){
x、 有效载荷+=1;
stack.push(x.children[0].as_mut())
}
}
这是可行的,但不必要的推/弹出不是很优雅

有没有更好的方法在安全防锈中表达这种模式
使用递归?

作为旁注——我相信您可以将
结构声明为包含
Vec
,而不是
Vec
。我不确定为什么…我猜这是因为
Vec
的大小不取决于它的泛型参数的大小(因为它只包含一个指针?)啊,是的,我的实际代码有一个子数组而不是向量,所以使用Box是必要的,但你是对的,在我的示例代码中,实际上不需要这个框。您能解释一下为什么这不是or的副本吗?正如你所看到的,很多人都问过类似的问题;所有这些都是通过搜索词“锈变参考树”找到的。当你问一个问题时,你是在思考,而看现有的问题是最简单的努力。@Shepmaster。很明显,我不能为长长的列表中的每一个问题插入解释,但我已经查看了所有问题,并验证了我的问题不是重复的。(他们中的大多数人关注的是同时指向父节点和子节点的指针的问题。)另外,你不应该认为我没有做过努力,也没有研究过现有的问题。好的。如3个链接副本中所述:
n={n}.children[0].As_mut()