LeetCode 779 第K个语法符号
发布日期:2021-05-11 01:24:29 浏览次数:15 分类:精选文章

本文共 1501 字,大约阅读时间需要 5 分钟。

kthGrammar递归问题分析及代码实现

问题描述

题目考察的是一个递归函数kthGrammar(N, K),其中N和K是输入参数。函数的逻辑如下:

  • 基本情况:当N等于1时,返回false。

  • 递归情况

    • 如果K大于2的(N-2)次方,则函数值取反调用自身,即kthGrammar(N, K - 2^(N-2))。
    • 如果K小于等于2的(N-2)次方,则函数值与kthGrammar(N-1, K)相同。
  • 解决方案

    代码
    class Solution {public:    int kthGrammar(int N, int K) {        if (helper(N, K))             return 1;        return 0;    }    bool helper(int N, int K) {        if (N == 1)             return false;        if (K > pow(2, N - 2)) {            return !helper(N, K - pow(2, N - 2));        } else {            return helper(N - 1, K);        }    }};

    递归分析

    递归条件的简化表述
    • 当N=1:返回false。这相当于初始情况,没有进一步递归可能。
    • 当K > 2^(N-2):函数调用自身,但K减去2^(N-2)。这里的操作可以理解为每次减少一个与N有关的固定值。
    • 当K ≤ 2^(N-2):递归进入N-1层,保持K不变。
    递推关系式

    通过递推关系式可以更清晰地看到函数的行为:

    • f(N, K) = !f(N, K - 2^(N-2)),当K > 2^(N-2)
    • f(N, K) = f(N-1, K),当K ≤ 2^(N-2)

    这一递推关系表明,当K超过某一阈值时,函数值会反转,并在每一步递减一个固定的2^(N-2),而若K未超过阈值,则继续递归到上层的N-1。

    实现代码解读

  • kthGrammar函数:这个函数调用了一个内部的helper函数,并根据返回结果返回1或0。

  • helper函数

    • 基本情况:当N=1时,返回false。
    • 递归判断
      • 如果K > 2^(N-2),则再次调用helper,调整K值,并取反返回。
      • 否则,递归到helper(N-1, K)。
  • 代码关键点
    • 递归终止条件:N=1,返回false。
    • 状态判断:根据K的大小决定是继续递归还是取反返回。
    • 递推规则:每次递减的K值是依赖于N的,这使得函数具有递归跳跃性。

    递归优化思路

    为了避免重复计算,可以考虑缓存中间结果或使用记忆化技巧。例如,可以用一个数组或者哈希表记录已经计算过的(N, K)组合,以减少重复计算。但在本题中,递归的终止条件足够佳,而且递推方式不会导致过深的递归栈,因此优化可能已经足够。

    测试与验证

    为了验证递归的正确性,可以设计以下测试案例:

  • 测试案例1

    • N=1,K=1
    • 预期结果:false
    • 实现结果:随着N=1返回false,函数值为0。
  • 测试案例2

    • N=2,K=2:此时N=2,2^(2-2)=1,K=2>1,递归到helper(2,1)

      • helper(2,1)=helper(2,1-1=0) ??此处K=0是否合理?
    • 可能需要重新测试。

  • 更全面测试:需要找出N和K的不同情况,逐一验证函数的行为。

  • 总结

    该递归函数通过递减K的固定步长,并根据N递减进行状态转换,最终得出结果。它的逻辑清晰,适用于解决特定范围内的递归问题。

    上一篇:Redis——Sentinel(哨兵)
    下一篇:LeetCode 173 二叉搜索树迭代器

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年05月10日 15时33分06秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章

    (原创)面向对象的系统对接接口编写。第5篇(完结) 2023-01-24
    2024网络安全岗就业前景如何?零基础入门到精通,收藏这篇就够了 2023-01-24
    2024零基础如何入门网络安全? 2023-01-24
    2024,java开发,已经炸了吗? 2023-01-24
    2025入门黑客技术必读书籍(非常全面)带你从小白进阶大佬!收藏这一篇就够了 2023-01-24
    2025入门黑客技术必读书籍(非常全面)带你从小白进阶大佬!收藏这篇就够了 2023-01-24
    2025大语言模型入门该怎么学?零基础入门到精通,收藏这篇就够了 2023-01-24
    2025年3月全国计算等级考试(报名操作指南)从零基础到精通,收藏这篇就够了! 2023-01-24
    2025年中国云计算市场四大趋势前瞻,从零基础到精通,收藏这篇就够了! 2023-01-24
    .off打开方式、文件格式和使用代码(Python示例) 2023-01-24
    2025年十大最佳漏洞管理工具,从零基础到精通,收藏这篇就够了! 2023-01-24
    2025年网络安全五大趋势与十大威胁预测,从零基础到精通,收藏这篇就够了! 2023-01-25
    2025想做黑客?先来学习 SQL 注入,零基础入门到精通,收藏这篇就够了 2023-01-25
    2025春招计算机就业哪些方向最香?零基础入门到精通,收藏这篇就够了 2023-01-25
    2025最全版《安全技术交底》.docx。从零基础到精通,收藏这篇就够了! 2023-01-25
    2025最新大模型技术学习过程梳理,零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版万字长文入门大语言模型(LLM)零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新0基础怎么转行网络安全?零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新Bash Shell入门指南,零基础入门到精通,收藏这篇就够了 2023-01-25
    2025版最新C++快速入门(适合小白)零基础入门到精通,收藏这篇就够了 2023-01-25