仅使用递归javascript创建棋盘

时间:2017-10-05 12:47:32

标签: javascript recursion

我有这样的作业: 使用递归创建一个名为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)。所以请帮助,任何建议都会有所帮助。

3 个答案:

答案 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;
&#13;
&#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.fromArray.fillString.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]))