< 返回版块

munpf 发表于 2021-03-31 11:39

Tags:闭包,递归

比如力扣的子集这个题,如果用递归的方法,我的想法是这样写的:

impl Solution {
    pub fn subsets(nums: Vec<i32>) -> Vec<Vec<i32>> {
        let mut res = Vec::new();
        let mut temp = Vec::new();
        let n = nums.len();
        let dfs = |start: usize| {
            res.push(temp.clone());
            for i in start..n {
                temp.push(nums[i]);
                dfs(i + 1);
                temp.pop();
            }
        };
        dfs(0);
        res
    }
}

但是编译报错找不到dfs(i + 1);这行的dfs,如果不捕获变量的话,用fn就可以了,但是这里需要,所以想问一下有没有什么方法可以做到让闭包递归?

评论区

写评论
作者 munpf 2021-04-02 18:39

我觉得应该是涉及了多次可变借用

--
👇
xie-jirong: 递归的本质要在栈上操作一层一层的参数(反映每次的状态), 如果数据被闭包捕获了,是否相当于“全局变量“,是不是跟递归的理念就违背了?

还是,如果是”可变借用“,那么,递归就涉及多次可变借用了,也与内存安全的设计要求冲突了。

xie-jirong 2021-03-31 19:43

递归的本质要在栈上操作一层一层的参数(反映每次的状态), 如果数据被闭包捕获了,是否相当于“全局变量“,是不是跟递归的理念就违背了?

还是,如果是”可变借用“,那么,递归就涉及多次可变借用了,也与内存安全的设计要求冲突了。

作者 munpf 2021-03-31 12:19

多谢,看来是没有方便的方法来实现了,还是老老实实传参吧

--
👇
songzhi: Is it possible to make a recursive closure in Rust?

1 共 4 条评论, 1 页