跳到主要内容

左递归

进行四则运算时,根据运算结合性,我们通常是从左往右依次计算,如下所示:

  • 语法规则: add: add | add + number

  • 代码实现:

    function additive(){
    additive();
    number();
    }

但是,根据add: add | add + number从左往右计算会在代码实现的过程中没有结束条件,造成无限递归的情况,这种情况称为左递归,那么我们通过如下方式解决:

  • 语法规则: add: number | number + add

  • 代码实现:

    function additive(){
    number();
    additive();
    }

但是,add: number | number + add这种逻辑失去了结合性,导致运算结果错误。所以我们根据巴克范式add: number | number + add再度改进:

  • 语法规则: add: number (+ number)*

总结: 四则运算过程中,如果使用add: add | add + number左递归的形式,会出现无限循环;如果使用add: number | number + add右递归的形式,会出现结合性失效的问题,导致运算结果错误; 所以我们最终采用将左递归改为循环来实现四则运算