如何正确在递归中写for循环?

发布于 2022-09-12 03:37:19 字数 882 浏览 16 评论 0

这是LeetCode的#### 55. 跳跃游戏

var canJump = function(nums) {
    let state = false;
    let length = nums.length-1;
    recur(length)
    //递归函数 num是位置 list是数组
    function recur(num){
        //终止条件 有0就结束
        if(num == 0){
            state = 0 ;
            return;
        }
        list = arrive(num);
        if(list.length == 0){
            return;
        }
        for(let i = 0; i < list.length; i++){
            recur(list[i]);
        }
    };
    //传递一个位置数字 返回可以到达的位置列表
    function arrive(num) {
        let list = [];
        for(let i = 0; i < num; i++){
            if(nums[i]+i == num){
                list.push(i)
            }
        }
        return list;
    }
    return state

};

应该循环两次 但是因为循环第一个内的递归不满足条件 后续的循环的第二次就不运行了 很迷惑 是因为递归不能用For吗

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

清风夜微凉 2022-09-19 03:37:19

return了,要想继续递归,要执行 recur

多像笑话 2022-09-19 03:37:19

递归当然可以用循环呀,需要几个循环取决于问题本身,这个问题用一个循环就可以了,给个参考代码

bool canJump(std::vector<int> &nums) {
    if (nums.empty())
        return false;
    if (nums.size() == 1)
        return true;

    bool can = false;
    for (int i = 1; i <= nums[0]; ++i) {
        if (i >= nums.size())
            break;
        std::vector<int> sub(nums.begin()+i, nums.end());
        can = can || canJump(sub);
    }

    return can;
}

递归搜索可以到达的子数组就可以了
另外,这个问题用递归可能会因超时而无法AC

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文