我有这样的作业: 使用递归创建一个名为checkerboard的函数,给定一个size参数,将在屏幕上绘制一个n×n棋盘。示例:棋盘格(5)
* * * * *
* * * * *
* * * * *
* * * * *
* * * * *
我做到了:
const star = function (n) {
if (n === 0)
return "";
return "*" + star(n-1);
};
const space = function (n) {
if (n === 0)
return "";
return " " + space(n-1);
};
const printer1 = function(n) {
if (n===0) {
return "";
}
return (star(1) + space(1) + printer1(n-1));
}
printer1(5);
但是我不能再进一步了,因为当我想添加一个新函数时先键入空格然后再按星号等等,日志只输出第一个函数(printer1)。所以请帮助,任何建议都会有所帮助。
答案 0 :(得分:1)
您不需要递归,可以使用Array.from()
和String.repeat()
let printer1 = function(n) {
return Array.from(Array(n), (e, i) => (i % 2 != 0 ? ' ' : '') + '* '.repeat(n).slice(0, -1)).join('\n')
}
console.log(printer1(5))
console.log(printer1(11))

以下是使用递归的类似解决方案。
let printer1 = function(n, i = 0) {
var r = '';
if(i == n) return r;
r = (i % 2 != 0 ? ' ' : '') + '* '.repeat(n).slice(0, -1) + '\n' + printer1(n, i+1)
return r
}
console.log(printer1(5))
console.log(printer1(11))

这是纯粹的递归解决方案。
let printer1 = function(n, i = 0) {
let r = '', space = i % 2 != 0 ? ' ' : ''
if(n == i) return r;
return r += space + row(n) + '\n' + printer1(n, i + 1)
}
let row = function(n, j = 0) {
let r = '', sign = j < n - 1 ? '* ' : '*';
if(n == j) return r;
return r += sign + row(n, j + 1);
}
console.log(printer1(5))
console.log(printer1(11))
&#13;
答案 1 :(得分:0)
var checkerboard = function(lineCount, collection, itemCount){
var joiner = function(count, item, delimiter){
return Array(count).fill().map(()=>item).join(delimiter)
}
collection = collection || []
if (itemCount === undefined){
itemCount = lineCount
}
if (lineCount === 0) {
return collection.join('\n');
}
if (collection.length % 2 === 0) {
collection.push(joiner(itemCount, '*', ' '))
} else {
collection.push(joiner(itemCount, ' ', '*'))
}
return checkerboard(lineCount - 1, collection, itemCount)
}
console.log(checkerboard(5))
console.log(checkerboard(11))
答案 2 :(得分:0)
你有一个良好的开端
这是一种只使用用户定义的函数及其应用的参数的技术 - 内置函数,如Array.from
,Array.fill
,String.repeat
,{{1}因为它们实际上并没有在这个级别教你任何东西 - 我们做使用二元运算符Array.prototype.join
进行字符串连接,并使用二元运算符+
来减少计数器。
这与你自己的代码相差不远,我想你会很感激。您可以查看这里发生的所有事情,这比它的执行情况更重要。作为一名学生,这种功能的可见性使您能够想象解释器在程序运行时将发展的过程;在学习过程中的任何一点都是一项关键技能
稍后,当您接触到您所用语言的其他功能或内置功能时,然后您可以评估这些功能是否在特定情况下为您的程序带来好处 - 现在,功能和参数;冲洗; 重复重复^ _ ^
-
当然,由于主板接受数组的单元格,我们可以有多种多样的
const board = (size, cells) =>
{
const loop = (acc, line, [c, ...cs]) =>
line === 0
? acc
: loop (acc + c (size) + '\n', line - 1, [...cs, c])
return loop ('', size, cells)
}
const cell = str => size =>
size === 0
? ''
: str + cell (str) (size - 1)
const black =
cell ('* ')
const white =
cell (' *')
console.log (board (7, [black, white]))