如何递归地解析嵌套列表?

时间:2016-09-14 19:56:16

标签: javascript parsing recursion

我尝试解析代表嵌套列表的标记。

我使用循环和递归编写了解析函数,它可以工作:

const assert = require('assert');

function parse(parent, tokens) {

  while(tokens.length > 0) {
    let token = tokens.shift();

    switch(token) {
      case '(':
        let children = parse([], tokens);
        parent.push(children);
        break;
      case ')':
        return parent;
      default:
        parent.push(token);
        break;
    }
  }
  return parent;
}

let tokens = ['(', '(', 1, 2, ')', ')', '(', 1, ')', '(', ')'];
let list = parse([], tokens);

console.log(list);
assert.deepEqual(list, [[[1, 2]], [1], []]);

仅使用递归的版本不起作用:

function parse(parent, tokens) {

  if(tokens.length > 0) {
    let token = tokens.shift();

    switch(token) {
      case '(':
        return parent.concat([parse([], tokens)]);
      case ')':
        return parent;
      default:
        return parse(parent.concat(token), tokens);
    }
  }
  else {
    return parent;
  }
}

如何让它发挥作用?

1 个答案:

答案 0 :(得分:1)

将迭代算法转换为递归时,您必须考虑到:

  • 基本情况:该方法不得递归的特定条件。
  • “减少”参数的复杂性,然后再将它们传递给递归调用。

在你的情况下,它很容易,因为parse方法已经有输入和输出的参数,所以你只需要通过遵循前面两条规则将它转换为递归。

关于如何获得输出:

  • 使用显式输出累加器参数:这是您已经拥有它的方式。
  • 不使用:将输出参数作为类的实例变量。