在不使用循环的情况下使用 JavaScript 生成语言字符串 anbcn 的最简洁方法是什么?
What is the most concise way to generate strings of language anbncn using JavaScript without using loops?
为了传达 Lambda 微积分的优点,甚至 JavaScript 实现此类(图灵完备)公式的能力,我希望看到一个 JS 文件可以实现的最优雅和简洁的方式给定自然数 n(从零开始),打印以下语言的正确字符串:
anbncn
这也意味着不使用外部库,也不使用迭代机制(例如“while”、“for”等)。
anbn ,例如,可能是上下文无关文法不能比以下更简单:
function print(n) {if(n>0) {console.log('a'); print(n--); console.log('b');}}
由于您对示例中的递归没问题,
function print(n) {
printA(n);
printB(n);
printC(n);
}
function printA(n) {
if (n > 0) {
console.log('a');
}
printA(n - 1);
}
// with printB and printC implemented similarly.
如果这不是那么吸引人,您可以按如下方式将三个 printX 函数组合在一起:
function printABC(n) {
print(n,3*n);
}
function print(division, current) {
if (current > 0) {
if (current < division) {
console.log('c');
}
else if (current < division * 2) {
console.log('b');
}
else {
console.log('a');
}
print(division, current - 1);
}
}
使用 <
与 <=
进行比较。
为了传达 Lambda 微积分的优点,甚至 JavaScript 实现此类(图灵完备)公式的能力,我希望看到一个 JS 文件可以实现的最优雅和简洁的方式给定自然数 n(从零开始),打印以下语言的正确字符串:
anbncn
这也意味着不使用外部库,也不使用迭代机制(例如“while”、“for”等)。
anbn ,例如,可能是上下文无关文法不能比以下更简单:
function print(n) {if(n>0) {console.log('a'); print(n--); console.log('b');}}
由于您对示例中的递归没问题,
function print(n) {
printA(n);
printB(n);
printC(n);
}
function printA(n) {
if (n > 0) {
console.log('a');
}
printA(n - 1);
}
// with printB and printC implemented similarly.
如果这不是那么吸引人,您可以按如下方式将三个 printX 函数组合在一起:
function printABC(n) {
print(n,3*n);
}
function print(division, current) {
if (current > 0) {
if (current < division) {
console.log('c');
}
else if (current < division * 2) {
console.log('b');
}
else {
console.log('a');
}
print(division, current - 1);
}
}
使用 <
与 <=
进行比较。