递归 | 第k个语法符号(Python)

在第一行我们写上一个 0。接下来的每一行,将前一行中的0替换为01,1替换为10。

给定行数 N 和序数 K,返回第 N 行中第 K个字符。(K从1开始)

例子:

输入: N = 1, K = 1
输出: 0

输入: N = 2, K = 1
输出: 0

输入: N = 2, K = 2
输出: 1

输入: N = 4, K = 5
输出: 1

解释:
第一行: 0
第二行: 01
第三行: 0110
第四行: 01101001

注意:

N 的范围 [1, 30].
K 的范围 [1, 2^(N-1)].

链接:https://leetcode-cn.com/problems/k-th-symbol-in-grammar

暴力法

class Solution(object):
    def kthGrammar(self, N, K):
        rows = []
        lastrow = '0'
        while len(rows) < N:
            rows.append(lastrow)
            lastrow = "".join('01' if x == '0' else '10'
                              for x in lastrow)
        return int(rows[-1][K-1])

递归法(父子递归)

class Solution(object):
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
归下降法是一种自顶向下的语法分析方法,它将一个语法定义转化为一组归的函数,每个函数对应于一个非终结符。这些函数通过归调用彼此来解析输入的文本,直到达到一个叶节点(即终结符)为止。 下面是归下降法的基本步骤: 1. 定义文法的产生式规则。 2. 将每个非终结符转化为一个对应的函数。 3. 对于每个函数,根据其产生式规则,编写相应的代码。 4. 对于每个产生式规则,编写相应的判断条件。 5. 在每个函数中归调用其他函数。 6. 在函数中处理语法错误。 下面是一个简单的例子,演示如何使用归下降法进行语法分析: 假设我们要分析以下简单的四则运算表达式: ``` expr ::= term ( ('+'|'-') term )* term ::= factor ( ('*'|'/') factor )* factor ::= number | '(' expr ')' number ::= [0-9]+ ``` 其中,`expr` 表示一个表达式,`term` 表示一个项,`factor` 表示一个因子,`number` 表示一个数字。 首先,我们将每个非终结符转化为一个对应的函数: ```python def expr(): t = term() while lookahead in ('+', '-'): op = lookahead match(lookahead) t2 = term() t = apply(op, t, t2) return t def term(): f = factor() while lookahead in ('*', '/'): op = lookahead match(lookahead) f2 = factor() f = apply(op, f, f2) return f def factor(): if lookahead.isdigit(): n = number() return n elif lookahead == '(': match('(') e = expr() match(')') return e else: error() ``` 其中,`match()` 函数用于匹配一个终结符,`apply()` 函数用于应用一个运算符,`lookahead` 表示下一个输入符号。 然后,我们可以编写判断条件的代码: ```python def match(token): if lookahead == token: advance() else: error() def advance(): global lookahead lookahead = get_next_token() def error(): raise Exception('Invalid syntax') ``` 其中,`advance()` 函数用于获取下一个输入符号,`get_next_token()` 函数用于从输入流中获取下一个符号。 最后,我们可以使用上述代码对输入的表达式进行语法分析: ```python lookahead = get_next_token() result = expr() if lookahead != EOF: error() print(result) ``` 其中,`EOF` 表示输入流的结束符号
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值