我尝试解析代表嵌套列表的标记。
我使用循环和递归编写了解析函数,它可以工作:
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;
}
}
如何让它发挥作用?
答案 0 :(得分:1)
将迭代算法转换为递归时,您必须考虑到:
在你的情况下,它很容易,因为parse
方法已经有输入和输出的参数,所以你只需要通过遵循前面两条规则将它转换为递归。
关于如何获得输出: